|
由于網(wǎng)上編寫的PWM都是在主函數(shù)中,我想將PWM模塊化,就自己編了一個(gè)PWM子函數(shù),但是用邏輯分析儀仿真出來的波形真是顛覆了我的認(rèn)知。
1、首先設(shè)置了T1定時(shí)中斷,工作方式為2,初值為0xff,中斷后中斷程序中tick自加,但是仿真的波形中tick跳變了,這是為什么?
2、我在程序中設(shè)置了PWM周期為10000個(gè)tick,理想上周期應(yīng)該是10000*1um,占空比設(shè)置固定值為50%,Ton=(周期*占空比)/100.0,也就是Ton應(yīng)該為5000,但是仿真波形Ton固定為156,這是為什么?
3、程序給出了限定if(tick<=Ton)PWM=1,仿真后tick=10060,Ton=156,PWM=1,跟if語句矛盾呀
有大神解答一下嗎?非常感謝
1.png (61.86 KB, 下載次數(shù): 67)
下載附件
2021-5-23 21:25 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- typedef unsigned char u8;
- typedef unsigned short u16;
- sbit PWM=P2^1;
- u16 tick;
- u8 Ton;
- /*********************************************************
- 函數(shù)名:T1Init
- 輸 入:
- 輸 出:
- 功 能:初始化T2并運(yùn)行
- *********************************************************/
- void T1Init()
- {
- //C_T2=1;CP_RL2=0;
- //TH2=0xff;
- //TL2=0xff;
- //TR2=1;EA=1;ET2=1;
- TMOD|=0x20;
- TH1=0xff;
- TL1=0xff;
- ET1=1;//打開定時(shí)器1中斷允許
- EA=1;//打開總中斷
- TR1=1;//打開定時(shí)器
- }
- /*********************************************************
- 函數(shù)名:T2Interrupt
- 輸 入:
- 輸 出:
- 功 能:
- *********************************************************/
- void T2Interrupt() interrupt 3
- {
- tick++;
- }
- /*********************************************************
- 函數(shù)名:PWM_Generator
- 輸 入:T:周期,Tx1um
- D:100倍占空比
- 輸 出:
- 功 能:
- *********************************************************/
- void PWM_Generator(u16 Period,u8 Duty)
- {
-
- Ton=(Period*Duty)/100.0;
- if(tick=Period)tick=0;
- if(tick>Ton)PWM=0;
- if(tick<=Ton)PWM=1;
- }
- /*********************************************************
- 函數(shù)名:main
- 輸 入:
- 輸 出:
- 功 能:
- *********************************************************/
- main()
- {
- //u8 i;
- T1Init();
- while(1)
- {
- //for(i=0;i<100;i++){PWM_Generator(1000,i);}
- //for(i=100;i<=0;i--){PWM_Generator(1000,i);}
- PWM_Generator(10000,50);
-
- }
- }
復(fù)制代碼
|
|