遇到一个PWM波形问题,请教大神。
时间:10-02
整理:3721RD
点击:
- ////////////////////////实现目标//////////////////////////////
- //单片机时钟频率12MHZ,T0做定时器使用,定时时长为0.1ms,要求用P1.0口输出周期为10ms,脉冲宽度按以下规律变化的信号:
- //第一个脉冲周期,P1.0引脚高电平持续时间为1*0.1ms;
- //第二个脉冲周期,P1.0引脚高电平持续时间为2*0.1ms;
- //第三个脉冲周期,P1.0引脚高电平持续时间为3*0.1ms;
- //第i个脉冲周期,P1.0引脚高电平持续时间为i*0.1ms(0=<i<=100).
- //即:占空比1%--100% PWM
- ///////////////////////定时器初值/////////////////////////////////
- //单片机Fosc=12Mhz,T0的定时时长为0.1ms, T0的计数次数为:
- // n=(t*Fosc)/12=(0.1ms*12MHz)/12=100
- //
- //
- ////////////////////////////////////////////////////////////
- #include<reg52.h>
- #define uchar unsigned char
- #define out P1^0
- uchar PWM,count;
- void display(uchar);
- void init()
- {
- TMOD=0X51; //T0:定时、方式1,
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- ET0=1; //开T0中断
- EA=1; //开全局中断、
- TR0=1; //启动定时器/计数器T0
- }
- void main()
- {
- //up=100-down;
- //count=1;
- init();
- while(1)
- {
- ?
- }
- }
- void time0() interrupt 1 using 1 //T0中断服务函数,中断型号为1
- {
- TH0=(65536-100)/256; //T0重置初值:0.1ms
- TL0=(65536-100)%256;
- count++;
- if(count==101) count=1;
- }
- //一个周期分成100份,每份0.1ms;在一个周期中,高电平占有的分量不断增加。
在程序中,写到如何循环一个周期卡壳了, 每个周期中有100次的10ms的波形,占空比1%——100%。
在main()应如何写?
我觉得main不用写,直接用中断好了
每次增加1%占空比
unsingned char duty_cnt = 1;
unsingned char duty = 0;
void time0() interrupt 1 using 1 //T0中断服务函数,中断型号为1
{
TH0=(65536-100)/256; //T0重置初值:0.1ms
TL0=(65536-100)%256;
duty++;
if( duty == duty_cnt )
{
//输出高电平
duty = 0;
duty_cnt ++; //每次增加0.1ms
if( duty_cnt ==101 )
{
duty_cnt =1;
duty = 0;
}
}
else
{
//输出低电平
}
}
以上代码随手写,可以实现,需要调试
另,用0.1ms的中断去做精度0.1ms的PWM,出来的波形可能有误差,用50us去做可能精度高一些
如果单片机带硬件PWM,使用硬件PWM会更好
!