本文参考该博主而写,这位博主大大写的十分详细,大家有兴趣可以去参考
(1条消息) 蓝桥杯单片机基础之PWM(Pulse width modulation)__WILLPOWER_的博客-CSDN博客https://willpower.blog.csdn.net/article/details/122393472我之所以再 画蛇添足 写这个是因为我想记录一下我作为小白视角如何去使用
(1)蓝桥杯第7届模拟风扇
蓝桥杯的使用包括:(1)按键控制引脚的不同PWM
因此,先分析一下这种使用情况(基于蓝桥杯第7届模拟风扇)
(1)pwm的实现原理
pwm实现,说白了就是控制信号的高低电平的比例!控制的方法通过定时器的中断函数进行控制。比如说,定时器时间设置为 1ms,那么到了 1ms就会进入该中断,这时我们设置一个计数值count,count是用来表示进入了几次中断,然后再设置一个max,表示一共需要进入多少次。当进入次数count=max时,count置为0,表示某信号的一个周期结束。
那么,如何实现占空比呢。我们可以利用count和max的比例进行控制,比如max=10,count这时为5,并且count在 1-5期间时,引脚输出高电平,而在6-10期间输出低电平。那么我们就说pwm的占空比为50%。
那么,如何实现引脚输出高电平或者低电平呢?代码如下:
if(pwm_cnt++ < pwm_max );
else
{
OutPut=1;
pwm_cnt = 0;
}
if(pwm_cnt == pwm_table[pwn_i])
{
OutPut=0;
}
可能很多同学看不懂,因为我没把代码全部copy上来。不过没事,因为我是自己记录用的,如果有问题,欢迎评论区咨询。或者看下文的全代码
(2)周期以及占空比确定
该比赛中,要求P34为 1Khz,且占空比为 2,3,7的比例。由周期于频率成倒数。所以可得:T=1ms。此外,为了实现周期要求,中断函数进入时间必须 < 1ms,我们设置为 100us,如何max为10,这样10*100=1000us=1ms了。那么占空比的count分别为2,3,7.
uint pwm_cnt=0;
uint pwm_max=10;
uint pwm_table[]={2,3,7};
uint pwn_i=0;
void Timer0Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
}
void Timer0Handle() interrupt 1
{
if(pwm_cnt++ < pwm_max );
else
{
OutPut=1;
pwm_cnt = 0;
}
if(pwm_cnt == pwm_table[pwn_i])
{
OutPut=0;
}
}
void KS1()
{
switch(key)
{
case 4:
{
pwn_i++;
if(pwn_i==3)
{
pwn_i=0;
}
}
}