由于网上编写的PWM都是在主函数中,我想将PWM模块化,就自己编了一个PWM子函数,但是用逻辑分析仪仿真出来的波形真是颠覆了我的认知。
1、首先设置了T1定时中断,工作方式为2,初值为0xff,中断后中断程序中tick自加,但是仿真的波形中tick跳变了,这是为什么?
2、我在程序中设置了PWM周期为10000个tick,理想上周期应该是10000*1um,占空比设置固定值为50%,Ton=(周期*占空比)/100.0,也就是Ton应该为5000,但是仿真波形Ton固定为156,这是为什么?
3、程序给出了限定if(tick<=Ton)PWM=1,仿真后tick=10060,Ton=156,PWM=1,跟if语句矛盾呀
有大神解答一下吗?非常感谢
单片机源程序如下:
- #include<reg52.h>
- typedef unsigned char u8;
- typedef unsigned short u16;
- sbit PWM=P2^1;
- u16 tick;
- u8 Ton;
- /*********************************************************
- 函数名:T1Init
- 输 入:
- 输 出:
- 功 能:初始化T2并运行
- *********************************************************/
- 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;//打开定时器1中断允许
- EA=1;//打开总中断
- TR1=1;//打开定时器
- }
- /*********************************************************
- 函数名:T2Interrupt
- 输 入:
- 输 出:
- 功 能:
- *********************************************************/
- void T2Interrupt() interrupt 3
- {
- tick++;
- }
- /*********************************************************
- 函数名: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;
- }
- /*********************************************************
- 函数名: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);
-
- }
- }
复制代码
|