目录
一、12届省赛pwm题目要求
二、相关概念
pwm实际上是输出功能,输出功能还是通过引脚来实现,利用引脚的复用功能,实现引脚的配置,从而实现pwn输出功能
我们的台灯就是通过调节占空比实现暗-亮-较亮的调节
2.定时器timer有没有pwm输出功能,参考《参考手册》
如此查询可知28、29、30章的timer都支持pwm输出功能
三、CubeMX配置
1.检查某个定时器是否支持pwm输出功能?
如果有channel的话表示支持PWM输出功能
2.对引脚PA7进行配置(题目要求)
一个timer可能有很多通道支持pwm输出,可以根据自己平时练习选一个通道(我选的是timer3的通道2)
3.配置所选定时器的时钟和对应通道的功能
4.分频
5.配置占空比
在分频的时候counter period是一个周期计数500
6.相关参数解释
1.
2、
3、
pwm1和pwm2的区别:
在进行PWM信号输出时,有两种PWM模式:PWM1模式和PWM2模式。
这两种PWM模式和输出有效电平的极性共同决定了PWM信号的波形。
PWM1模式
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为有效电平,否则为无效电平。递减计数模式则刚好相反。
PWM2模式
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为无效电平,否则为有效电平。递减计数模式则刚好相反。
4、
5、占空比就相当于平均输出高电平20%,实验结果如下(平均输出专业术语就是pwm输出)
四、代码
1、CubeMX自动生成的代码
2、设置变量
3、根据题目要求B4按键的共能,更新按键函数
//Key processing function
void Key_Proc(void)
{
uint8_t cur_key = 0;
cur_key = Key_Scan();
switch(cur_key)
{
case 1:
Show_Flag++;
if(Show_Flag == 3)
Show_Flag = 1;
Update_Flag = 1;
break;
case 2:
if(Show_Flag == 2)
{
CNBR_Price += 0.5f;
VNBR_Price += 0.5f;
Update_Flag = 1;
}
break;
case 3:
if(Show_Flag == 2)
{
CNBR_Price -= 0.5f;
VNBR_Price -= 0.5f;
if(CNBR_Price < 0)
CNBR_Price = 0.0f;
if(VNBR_Price < 0)
VNBR_Price = 0.0f;
Update_Flag = 1;
}
break;
case 4:
PWM_Flag ^=1;//yihuo 0/1
break;
default:
;
}
}
4、LED函数
void Led_Proc(void)
{
if(IDEL_Size > 0)
LED_Ctrl(LED1, ON);
else
LED_Ctrl(LED1, OFF);
if(PWM_Flag==1)
LED_Ctrl(LED2,ON);
else
LED_Ctrl(LED2,OFF);
}
5.1、PWM函数
void PWM_Proc(void )
{
if(PWM_Flag==0)
{
HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );
HAL_Delay(5);
}
else
{
HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );
HAL_Delay(5);
}
}
5.2、timer定时器通道相关函数学习
HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );
当有按键按下的时候,开启timer3的2通道的PWM输出
HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );
当有按键按下的时候,关闭timer3的2通道的PWM输出
注:__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,250) 是专门用来设置占空比的函数,这样就是占空比为250/500=50%
6、主函数和函数声明
五、实验结果
通过控制B4能够实现LED2的亮灭
串口部分的结果问题: