本电工最近做了一个军工项目,其他不在这里聊了,其中有一个功能是用PWM驱动MOS管,进而驱动加热膜。
硬件简介:
STM8S105C6T6, PD2---光耦----MOS---PI加热盘。
软件简介:
PD2端口,用TIM2_CH3,输出可调的PWM方波。
遇到的问题:
正常配置TIM2为PWM模式,代码都正确,但就是不输出PWM波形。其他两路,TIM2_CH1,TIM2_CH2,同样的代码,配置,都正常输出PWM波形。
void pwm_init( void )
{
GPIO_Init( GPIOD, (GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4), GPIO_MODE_OUT_PP_HIGH_FAST );
TIM2_TimeBaseInit( TIM2_PRESCALER_8, 500-1 );
TIM2_OC1Init( TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 500, TIM2_OCPOLARITY_HIGH );
TIM2_OC1PreloadConfig( ENABLE );
TIM2_OC2Init( TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 500, TIM2_OCPOLARITY_HIGH );
TIM2_OC2PreloadConfig( ENABLE );
TIM2_OC3Init( TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 500, TIM2_OCPOLARITY_HIGH );
TIM2_OC3PreloadConfig( ENABLE );
TIM2_Cmd( ENABLE );
}
void SetTIM2_PWM_DutyCycle( uint8_t Chx,uint16_t TIM2_Pulse )
{
if(Chx == FAN_EX)
{
TIM2->CCR1H = ( uint8_t )( TIM2_Pulse >> 8 );
TIM2->CCR1L = ( uint8_t )( TIM2_Pulse );
TIM2->CCR2H = ( uint8_t )( TIM2_Pulse >> 8 );
TIM2->CCR2L = ( uint8_t )( TIM2_Pulse );
}
else if(Chx == FAN_IN)
{
TIM2->CCR3H = ( uint8_t )( TIM2_Pulse >> 8 );
TIM2->CCR3L = ( uint8_t )( TIM2_Pulse );
}
}
解决办法:
遇到问题,电工第一想着就是翻DATA SHEET,这个是个好习惯,比百度,论坛等,找问题要来的直接,干脆,不耽误时间。翻到下图这个地方,问题解决,还是原来的代码不变,只需要把option byte用STVP改一下,烧录一下即可。如下图的DATA SHEET,对于PD2口作为TIM2_CH3的重定义说明。需要把option byte AFR1 配置成1,如下图所示:
1
2
有任何问题,随时交流