STM32物联网项目-高级定时器软件仿真输出互补PWM信号

高级定时器软件仿真输出互补PWM信号

上次介绍了高级定时器特有的功能:重复计数器,互补PWM输出,死区,刹车功能

这里介绍使用keil软件仿真输出互补PWM信号和带死区后的互补信号

CubeMX配置

TIM1配置

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第1张图片

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第2张图片

预分频系数为71,即晶振振1次1us,自动重载值为99,即PWM输出周期为100us,也就0.1ms

死区时间先设置为0,后续再设置看效果

50%的占空比,互补通道极性CH Polarity和CHN Polarity设置为低电平,后续可以根据输出的PWM波形来调整,也就设置计数值小于50时是输出高电平还是低电平,可根据实际应用场景来设置,高低电平都可以

因为用到了触摸按键1和LED灯,触摸按键引脚设置为外部中断,下降沿触发,LED设置为推挽输出即可,比较简单,NVIC记得开启外部中断

代码

HAL库函数

开启和关闭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);

MyInit.c

代码使用自己的框架,没有新增文件,因为初始化工作已经用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);
}

CallBack.c

在外部中断回调函数中,通过触摸按键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%
    }
  }
}

keil软件设置

在Debug选项中选择左边的软件仿真,DLL文件按下图设置

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第3张图片

软件仿真这两个选项可以通过下面的方法找到,不同芯片的类似

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第4张图片

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第5张图片

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第6张图片

将找到的DLL文件复制到选项框里即可

然后芯片的外部晶振选择8MHz,根据自己芯片来选择,f103ZET6的外部晶振是8M,如果设置错,则后面软件仿真输出的PWM周期不对

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第7张图片

编译代码,然后开始仿真

开始仿真——互补PWM输出

打开逻辑分析仪

在这里插入图片描述

点击Setup添加想要查看输出信号的引脚

在这里插入图片描述

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第8张图片

显示类型都选择Bit

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第9张图片

点击全速运行,过一会就能看到输出的PWM波形了,两个通道成互补状态,上面通道输出高电平,下面通道输出低电平,点击Cursor游标选项,可以测量一个PWM信号的周期是多少,看是否是前面设定的值

周期为0.1ms,频率约为10000Hz,也就是10kHz,测量得有点误差,这与前面71和99设定的周期是一样的

也可以看出占空比为50%,与前面设置的也是一样的
STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第10张图片

因为代码中编写了按键外部中断切换占空比的功能,所以要在软件仿真中模拟按键按下的功能,按下图打开GPIOE引脚

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第11张图片

因为按键接到了PE0引脚,所以只需要点击PE0,就模拟了按下按键的动作

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第12张图片

PE0点击一次表示按下,再点一次表示松开,然后逻辑分析仪就会输出信号的变化,蓝色是按键,粉色是LED灯,LED灯状态翻转

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第13张图片

放大波形,可以看到,在按键下降沿产生后,PWM的占空比就被改变了,由原来的50%变为了80%,一个周期内高电平的时间明显变长

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第14张图片

带死区的互补PWM信号输出

在CubeMX中设置死区时间为10,重新生成工程

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第15张图片

再编译,查看PWM波形的变化,可以看到上下PWM波形并不完全互补,当上面通道要输出高电平导通MOS管时,会延时一段时间,等待下面通道输出低电平完全关闭MOS管后,再开启上面的MOS管,这段延时的时间就叫死区时间

改变死区时间的值,PWM波形就会发生改变

STM32物联网项目-高级定时器软件仿真输出互补PWM信号_第16张图片
注意:死区时间设置的值要小于占空比的值,不然会无法输出PWM

你可能感兴趣的:(STM32物联网项目,stm32,物联网,单片机,arm,学习)