资深版主
- 积分
- 14287
- 金钱
- 14287
- 注册时间
- 2018-8-3
- 在线时间
- 1147 小时
|
本帖最后由 翼行园子 于 2019-8-29 17:30 编辑
本帖是使用探索者高级定时器TIM8 互补输出PWM 并带上死区时间及控制
注意:P12的跳线帽即ADC和TPAD的这个跳线帽 要记得拔掉,因为PA5作为ADC输入引脚,同时做TPAD检测脚,本实验PA5作为TIM8_CH1N的IO
高级控制定时器( TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间。
这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延
迟、开关器件产生的延迟...)来调整死区时间(详细的介绍可以参考下STM32F4中文参考手册)
死区时间:65ns 现象如图:一格是50ns 由图可以看出大概是65ns左右,算法看代码的死区配置!!
实验现象TIM8输出互补的PWM波形 并可以通过按键去改变互补PWM的占空比 且通过死区配置PA6为BKIN为故障信号,当PA6 接到低电平时 PWM输出为所配置的状态
首先演示的是互补PWM输出 现象如下:
在通过按键改变其占空比值 现象如下:
主函数主要是通过按键改占空比:
[mw_shl_code=cpp,true]int main(void)
{
u8 key=0;
u16 led0pwmval=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200);//初始化串口波特率为115200
KEY_Init();
LED_Init();
TIM8_PWM_Init(500-1,168-1); //168M/168=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
{
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
if(led0pwmval<499)
led0pwmval+=50;//led0pwmval递增
else
led0pwmval=499;
TIM_SetCompare1(TIM8,led0pwmval);
}
delay_ms(10);
if(key==KEY1_PRES)
{
if(led0pwmval>50)
led0pwmval-=50; //led0pwmval递减
else
led0pwmval=0;
TIM_SetCompare1(TIM8,led0pwmval); //修改比较值,修改占空比
}
LED0=!LED0; //LED0翻转
delay_ms(100);
}
}[/mw_shl_code]
将TIM8_BKIN(PA6)接到GND,现象如下:
[mw_shl_code=cpp,true]void TIM8_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); //TIM8时钟使能 CK_INT=168M
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8); //GPIOC6复用为定时器8 TIM8_CH1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM8); //GPIOA5复用为定时器8 TIM8_CH1N
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM8); //GPIOA6复用为定时器8 TIM8_BKIN
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //GPIOC6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不上拉不下拉
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_5; //GPIOA5\6
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5\6
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 时钟分频因子 ,配置死区时间时需要用到
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 重复计数器的值,没用到不用管
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);//初始化定时器8
//初始化TIM8 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;// 互补输出使能
TIM_OCInitStructure.TIM_Pulse = 127; // 设置初始占空比大小
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;// 互补输出高电平有效
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;// 主输出在被禁止时为高电平 当PA6禁止时用到
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;// 互补输出在被禁止时为低电平 当PA6禁止时用到
TIM_OC1Init(TIM8, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM8 OC1
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能TIM8在CCR1上的预装载寄存器
/*-------------------刹车和死区结构体初始化-------------------*/
// 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
// 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述
TIM_BDTRInitStructure.TIM_DeadTime = 11; //11*1/168M=65ns
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
// 当BKIN引脚检测到低电平的时候,输出比较信号被禁止,就好像是刹车一样
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; //当PA6接到低电平的时候 PWM会执行被禁止时所配的状态
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM8, &TIM_BDTRInitStructure);
TIM_Cmd(TIM8, ENABLE); //使能TIM8
TIM_CtrlPWMOutputs(TIM8, ENABLE);// 主输出使能,当使用的是通用定时器时,这句不需要
} [/mw_shl_code]
当PA6 接到低电平时 PWM输出为所配置的状态,这部分的代码主要是:
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; //当PA6接到低电平的时候 PWM会执行被禁止时所配的状态
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;// 主输出在被禁止时为高电平 当PA6禁止时用到
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;// 互补输出在被禁止时为低电平 当PA6禁止时用到
|
|