这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战
在使用STM8单片机输出PWM波的时候,有一个非常实用的功能就是刹车功能。这个刹车功能就相当于设备中的紧急制动按钮一样。比如在输出PWM驱动电机的时候,突然系统出现了异常,要立即停止PWM波形的输出,这时候如果用软件来控制PWM输出的停止响应时间就会比较长,刹车功能相当于一个中断,一旦触发,就会立即停止PWM的波形输出,响应速度是非常快的。
关于刹车功能,官方资料中介绍如下:
下面直接使用代码演示一下,如何在输出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位
其中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波形输出,刹车功能也不起作用。
开启重映射功能步骤如下:
使用STVP软件打开要烧写的二进制文件,然后在软件中间选择OPTION BYTE选项。
AFR0---AFR7位用来设置引脚重映射功能,默认情况下的引脚功能如后面选项所示,在这里要单击一下选项,在下拉列表中选择自己需要设置的功能。
单击AFR7后面的选项,就会自动弹出来一个列表,在这个列表中选择自己需要重映射的功能。由于代码中使用的是PWM互补输出功能,所以这里就要选择上面的选项。将PC3口重映射为TIM1_CH1N功能,将PC4口重映射为TIM1_CH2N功能。
同样的方法设置其他选项
将PC3口重映射为TIM1_CH1N,将PC6口重映射为TIM1_CH1,将PB5口重映射为TIM1_BKIN。也就是开启PWM互补输出功能,同时将PB5口作为刹车功能。
重映射功能设置完成后,下来就可以点击下载按钮,将代码下载到单片机中。这时通过示波器就可以看到在PC6和PC3口有互补PWM波形输出,这时如果给PB5口一个低电平,PWM输出就会立即停止。当PB5口电平恢复为高电平时,PWM输出依然是关断的。相当于只要PB5口出现一次低电平,PWM输出就会永远关断。想要恢复PWM输出,就需要重启系统,这个和设备的急停按钮使用功能是一样的。