特点1:Timer0输出6路PWM信号 三组CH0 CH1 CH2每组输出2路互补信号
特点2: 加入死区设置(保证互补波形不会同时输出高电平)
特点3: 加入刹车保护:设置刹车保护脚BKIN-PB12 默认上拉,当被拉到GND后立即停止说要PWM输出,当释放BKIN脚后(高电平) PWM立刻重新输出PWM
步骤1:IO口配置
void gpio_config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
/*Configure PA8 PA9 PA10(TIMER0 CH0 CH1 CH2) as alternate function*/
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_8);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_10);
/*Configure PB13 PB14 PB15(TIMER0 CH0N CH1N CH2N) as alternate function*/
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_13);
gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_14);
gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_15);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_12);//设置刹车信号 默认上拉 如果出现低电平则刹车 停止PWM输出
gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_12);
}
1 PB12 设置AF2模式,默认上拉
2 PA8 PA9 PA10 为上管的驱动,PB13 PB14 PB15 作为下管驱动 PA8-PB13互补,PA9-PB14互补,PA10-PB15互补
步骤2:定时器配置,只有高级定时器才有死区和刹车设置
void timer_config(void)
{
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
timer_break_parameter_struct timer_Breakinitpara;
rcu_periph_clock_enable(RCU_TIMER0);
timer_deinit(TIMER0);
/* TIMER0 configuration */
timer_initpara.prescaler = 0;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 9999;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER0, &timer_initpara);
/* CH1,CH2 and CH3 configuration in PWM mode 0 */
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;//TIMER_OC_POLARITY_LOW TIMER_OC_POLARITY_HIGH
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;// TIMER_OCN_POLARITY_LOW TIMER_OCN_POLARITY_HIGH
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_S

517

被折叠的 条评论
为什么被折叠?



