上次介绍了高级定时器特有的功能:重复计数器,互补PWM输出,死区,刹车功能
这里介绍使用keil软件仿真输出互补PWM信号和带死区后的互补信号
TIM1配置
预分频系数为71,即晶振振1次1us,自动重载值为99,即PWM输出周期为100us,也就0.1ms
死区时间先设置为0,后续再设置看效果
50%的占空比,互补通道极性CH Polarity和CHN Polarity设置为低电平,后续可以根据输出的PWM波形来调整,也就设置计数值小于50时是输出高电平还是低电平,可根据实际应用场景来设置,高低电平都可以
因为用到了触摸按键1和LED灯,触摸按键引脚设置为外部中断,下降沿触发,LED设置为推挽输出即可,比较简单,NVIC记得开启外部中断
开启和关闭PWM函数,在
/*Blocking mode: Polling*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim,uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim,uint32_t Channel);
开启和关闭互补PWM函数,这是个拓展功能,所以在
/*Blocking mode : polling*/
HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim,uint32_t Channel);
HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim,uint32_t Channel);
代码使用自己的框架,没有新增文件,因为初始化工作已经用CubeMX软件完成了,所以只需在初始化函数中开启定时器1的互补输出功能即可
/*
* @name Peripheral_Set
* @brief 外设设置
* @param None
* @retval None
*/
static void Peripheral_Set()
{
//启动定时器1互补PWM输出
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
}
在外部中断回调函数中,通过触摸按键1切换占空比
/*
* @name HAL_GPIO_EXTI_Callback
* @brief 外部中断回调函数
* @param GPIO_Pin:触发外部中断的引脚
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY1_Pin)
{
LED.LED_Fun(LED1,LED_Flip); //翻转LED1状态
//通过触摸按键1切换占空比
if(TIM1->CCR1 == 50)
{
TIM1->CCR1 = 80; //占空比切换为80%
}
else
{
TIM1->CCR1 = 50; //占空比切换为50%
}
}
}
在Debug选项中选择左边的软件仿真,DLL文件按下图设置
软件仿真这两个选项可以通过下面的方法找到,不同芯片的类似
将找到的DLL文件复制到选项框里即可
然后芯片的外部晶振选择8MHz,根据自己芯片来选择,f103ZET6的外部晶振是8M,如果设置错,则后面软件仿真输出的PWM周期不对
编译代码,然后开始仿真
打开逻辑分析仪
点击Setup添加想要查看输出信号的引脚
显示类型都选择Bit
点击全速运行,过一会就能看到输出的PWM波形了,两个通道成互补状态,上面通道输出高电平,下面通道输出低电平,点击Cursor游标选项,可以测量一个PWM信号的周期是多少,看是否是前面设定的值
周期为0.1ms,频率约为10000Hz,也就是10kHz,测量得有点误差,这与前面71和99设定的周期是一样的
因为代码中编写了按键外部中断切换占空比的功能,所以要在软件仿真中模拟按键按下的功能,按下图打开GPIOE引脚
因为按键接到了PE0引脚,所以只需要点击PE0,就模拟了按下按键的动作
PE0点击一次表示按下,再点一次表示松开,然后逻辑分析仪就会输出信号的变化,蓝色是按键,粉色是LED灯,LED灯状态翻转
放大波形,可以看到,在按键下降沿产生后,PWM的占空比就被改变了,由原来的50%变为了80%,一个周期内高电平的时间明显变长
在CubeMX中设置死区时间为10,重新生成工程
再编译,查看PWM波形的变化,可以看到上下PWM波形并不完全互补,当上面通道要输出高电平导通MOS管时,会延时一段时间,等待下面通道输出低电平完全关闭MOS管后,再开启上面的MOS管,这段延时的时间就叫死区时间
改变死区时间的值,PWM波形就会发生改变