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


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

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

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

    CubeMX配置

    TIM1配置

    在这里插入图片描述

    在这里插入图片描述

    分频系数为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);
    
    • 1
    • 2
    • 3

    开启和关闭互补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);
    
    • 1
    • 2
    • 3
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    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%
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    keil软件设置

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

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

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

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

    在这里插入图片描述

    编译代码,然后开始仿真

    开始仿真——互补PWM输出

    打开逻辑分析仪

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

    显示类型都选择Bit

    在这里插入图片描述

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

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

    也可以看出占空比为50%,与前面设置的也是一样的
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    带死区的互补PWM信号输出

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

    在这里插入图片描述

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

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

    在这里插入图片描述
    注意:死区时间设置的值要小于占空比的值,不然会无法输出PWM

  • 相关阅读:
    群晖NAS:DS Video、Jellyfin等视频电影电视剧海报、背景墙搜刮器
    TCP的优化
    竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉
    java基于微信小程序的寻医问药 医院预约挂号系统 uniapp小程序
    python3 重启docker方法
    日志(四)
    工程管理系统之Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    设计模式详解(九)——桥接模式
    Ubuntu服务器中java -jar 后台运行Spring Boot项目
    libopus 实现pcm 编码到opus
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126701797