STM8单片机PWM刹车功能使用

2,301 阅读4分钟

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

  在使用STM8单片机输出PWM波的时候,有一个非常实用的功能就是刹车功能。这个刹车功能就相当于设备中的紧急制动按钮一样。比如在输出PWM驱动电机的时候,突然系统出现了异常,要立即停止PWM波形的输出,这时候如果用软件来控制PWM输出的停止响应时间就会比较长,刹车功能相当于一个中断,一旦触发,就会立即停止PWM的波形输出,响应速度是非常快的。

  关于刹车功能,官方资料中介绍如下:

image.png

image.png

  下面直接使用代码演示一下,如何在输出PWM波形的时候,使用刹车功能。

#include "pwm.h"
void PWM_GPIO_Init( void )
{
    PC_DDR |= ( 1 << 6 );  //PC6 推挽输出
    PC_CR1 |= ( 1 << 6 );
}
//定时器1初始化
void TIM1_Init( void )
{
    PWM_GPIO_Init();
    TIM1_CR1 = (1<<7);                        //自动预装载允许
    
    TIM1_CCMR1 = (6<<4)|(1<<3)|(1<<2);      //TIM1 CH1 PWM1  输出比较1预装载使能  输出比较1 快速使能
    //TIM1_CCER1 |= 0x01;                   //CC1为输出 高电平有效
    TIM1_CCER1 |= (1<<0)|(1<<2);            //CC1为输出 OC1高电平有效 开启OC1N OC1N高电平有效
    TIM1_PSCRH = 0x00;                      //预分频 0 
    TIM1_PSCRL = 0x00;                      //16M
    
    TIM1_ARRH = FRE >> 8;                     //设定自动重装载值高8位
    TIM1_ARRL = FRE;                          //设置自动重装载值低8位
  
    TIM1_BKR |= (1<<7)|(1<<4);                 //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平  开启刹车输入 刹车输入低电平有效
    TIM1_DTR = 0x18;                          //死区时间 24*125ns=3000ns
    TIM1_EGR = (1<<0);                        //产生更新事件
    TIM1_CR1 |= 0x01;                           //使能计数器
}
//TIM1 CH1  PC6
void TIM1_CH1_OUT( unsigned int DC )
{
    TIM1_CCR1H = DC >> 8;   //捕获比较寄存器高8位
    TIM1_CCR1L = DC;        //捕获比较寄存器低8位 占空比值
}

在初始化的时候使能TIM1_BKR寄存器中的MOE位和BKE位

image.png 其中MOE位用来使能PWM波形的输出,BKE位用来开启刹车输入功能。刹车极性为默认值,也就是低电平有效。当刹车信号为高电平时PWM波形正常输出,当刹车极性为低电平时,PWM输出停止。PWM波形使用TIM1_CH1和TIM1_CH1N互补通道输出。

#include "iostm8s103F3.h"
#include "led.h"
#include "pwm.h"

void SysClkInit( void )
{
    CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率
    CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频
}
//PB5口设置为输入口 做为刹车控制引脚
void BK_GPIO_Init( void )
{
    PB_DDR &= ~( 1 << 5 );       //PB5 输入模式
    PB_CR1 |= ( 1 << 5 );        //PB5 带上拉电阻输出
}
/*
  PC6为 TIM1_CH1    输出通道
  PC3为 TIM1_CH1N   输出通道
  PB5为 刹车控制端口  当PB5为低电平时 PWM关闭互补波形输出  这个过程为单片机内部硬件自动控制 不需要软件参与
  需要在选项字节中开启 PC6 TIM1_CH1  PC3 TIM1_CH1N  PB5 TIM1_BKIN 功能
*/
void main( void )
{
    SysClkInit();
    __asm( "sim" );                       //禁止中断
    BK_GPIO_Init();                       //刹车控制输入端
    TIM1_Init();
    __asm( "rim" );                       //开启中断
    delay_ms( 500 );
    TIM1_CH1_OUT(FRE/2);                  //设置占空比为50%
    while( 1 )
    {
        LED = 0;                         //LED=0 和 LED=!LED  执行效率差距很大
        __asm( "nop" );                  
        LED = 1;
        __asm( "nop" );
    }
}

然后还需要初始化一下刹车的IO口,刹车功能使用的是PB5口,这里将PB5口设置为输入口。PB5口被外部上拉电阻拉为高电平,当异常产生时,PB5口被拉为低电平,产生一个刹车信号,然后PWM信号就停止输出。

这里要注意一个问题代码中使用的PWM互补输出功能和刹车功能都是单片机的重映射功能,不是默认功能。所以在烧写代码的时候一定要开启这三个引脚的重映射功能。否则不会有PWM波形输出,刹车功能也不起作用。

开启重映射功能步骤如下:

image.png

使用STVP软件打开要烧写的二进制文件,然后在软件中间选择OPTION BYTE选项。

image.png

AFR0---AFR7位用来设置引脚重映射功能,默认情况下的引脚功能如后面选项所示,在这里要单击一下选项,在下拉列表中选择自己需要设置的功能。

image.png

单击AFR7后面的选项,就会自动弹出来一个列表,在这个列表中选择自己需要重映射的功能。由于代码中使用的是PWM互补输出功能,所以这里就要选择上面的选项。将PC3口重映射为TIM1_CH1N功能,将PC4口重映射为TIM1_CH2N功能。

同样的方法设置其他选项

image.png

将PC3口重映射为TIM1_CH1N,将PC6口重映射为TIM1_CH1,将PB5口重映射为TIM1_BKIN。也就是开启PWM互补输出功能,同时将PB5口作为刹车功能。

重映射功能设置完成后,下来就可以点击下载按钮,将代码下载到单片机中。这时通过示波器就可以看到在PC6和PC3口有互补PWM波形输出,这时如果给PB5口一个低电平,PWM输出就会立即停止。当PB5口电平恢复为高电平时,PWM输出依然是关断的。相当于只要PB5口出现一次低电平,PWM输出就会永远关断。想要恢复PWM输出,就需要重启系统,这个和设备的急停按钮使用功能是一样的。