大佬們 最近在做直流有刷電機的驅動,使用到STM32高級定時器TIM1的通道1和互補通道,電機的驅動模式采用單極模式,即驅動信號為1路的PWM,一路高電平,且這兩種信號通過按鈕可以交替實現電機的轉向。
我看的視頻是HAL庫編寫的驅動程序,使用的就是TIM1的通道1和互補通道,我編寫的庫函數版本跟BSP的結構大體相同,但是輸出的波形不是我想要的
我根據參考手冊將TIM1配置成MOE=1,,OSSR=1,然后用TIM_CCxNCmd()函數關閉互補通道,但是仿真輸出的還是低電平(非ST-link仿真),跟參考手冊說的這么不一樣?請問大佬們問題出在哪里?感謝回答
初始化程序如下:
void TIM1_GPIO_init(void)
{
/*查閱中文參考手冊 */
/*TIM1通道1的 輸出引腳為PA8 */
/*TIM1通道1的互補輸出引腳為PB13 */
/*變量定義*/
GPIO_InitTypeDef GPIO_InitTypeStructure;
/*使能GPIO的時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
/*使能GPIO的端口復用*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);
/*初始化GPIOA*/
GPIO_InitTypeStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitTypeStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitTypeStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復用推挽輸出
GPIO_Init(GPIOA,&GPIO_InitTypeStructure);
/*初始化GPIOB*/
GPIO_InitTypeStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOB,&GPIO_InitTypeStructure);
}
void TIM1Init(void)
{
/*相關變量申明*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStr;
TIM_OCInitTypeDef TIM_OCInitTypeStr;
TIM_BDTRInitTypeDef TIM_BDTRInitTypeStr;
/*啟動TIM1的時鐘,CK_INT=72M*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
/*設置時基結構體初始化*/
TIM_TimeBaseInitTypeStr.TIM_Prescaler =7199; //CK_INT=72M,分頻后頻率為10k,時基周期為0.1ms
TIM_TimeBaseInitTypeStr.TIM_CounterMode =TIM_CounterMode_Up; //向上計數
TIM_TimeBaseInitTypeStr.TIM_Period =4999; //arr,定時器周期為5000個0.1ms,為500ms
TIM_TimeBaseInitTypeStr.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseInitTypeStr.TIM_RepetitionCounter =0; //重復計數器的值,沒用到不用管
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitTypeStr);
/*輸出比較結構體初始化*/
TIM_OCInitTypeStr.TIM_OCMode =TIM_OCMode_PWM1; //PWM mode1,計數值CNT<設定值CCRx,為有效電平
TIM_OCInitTypeStr.TIM_OutputState =TIM_OutputState_Enable; //使能輸出
TIM_OCInitTypeStr.TIM_OutputNState =TIM_OutputNState_Enable; //使能互補輸出
TIM_OCInitTypeStr.TIM_Pulse =1000; //默認20%的占空比
TIM_OCInitTypeStr.TIM_OCPolarity =TIM_OCPolarity_Low; //極性為0(高電平有效),輸出先為高電平,后低電平
TIM_OCInitTypeStr.TIM_OCNPolarity =TIM_OCNPolarity_Low;
TIM_OCInitTypeStr.TIM_OCIdleState =TIM_OCIdleState_Set; //空閑模式(主輸出為0的時候,如剎車的時候)下,為高電平有效
TIM_OCInitTypeStr.TIM_OCNIdleState =TIM_OCNIdleState_Set; //空閑模式(剎車的時候)下,為低電平有效
TIM_OC1Init(TIM1,&TIM_OCInitTypeStr); //初始化TIM1通道1
/*剎車和死區結構體初始化*/
/*主要設置運行模式下(MOD=1),通道關閉后的輸出電平*/
TIM_BDTRInitTypeStr.TIM_OSSRState =TIM_OSSRState_Enable; //運行模式下關閉狀態使能
TIM_BDTRInitTypeStr.TIM_OSSIState =TIM_OSSIState_Disable; //空閑模式下關閉狀態使能
TIM_BDTRInitTypeStr.TIM_LOCKLevel =TIM_LOCKLevel_1; //鎖定級別1
TIM_BDTRInitTypeStr.TIM_DeadTime =0; //設定死區時間,硬件自帶死區
TIM_BDTRInitTypeStr.TIM_Break =TIM_Break_Disable; //剎車通道使能
TIM_BDTRInitTypeStr.TIM_BreakPolarity =TIM_BreakPolarity_High; //剎車通道為高電平時進行剎車
TIM_BDTRInitTypeStr.TIM_AutomaticOutput =TIM_AutomaticOutput_Enable;//剎車后自動復位,不使能則不會自動復位
TIM_BDTRConfig(TIM1,&TIM_BDTRInitTypeStr);
/*預裝載arr*/
TIM_ARRPreloadConfig(TIM1,ENABLE);
/*使能TIM1*/
TIM_Cmd(TIM1,ENABLE);
/*使能TIM1主輸出*/
TIM_CtrlPWMOutputs(TIM1, ENABLE);
/*失能TIM1互補輸出引腳*/
// TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
TIM_CCxNCmd(TIM1,TIM_Channel_1,TIM_CCxN_Disable);
}
void SD_GPIO_Init(void)
{
/*變量定義*/
GPIO_InitTypeDef GPIO_InitTypeStructure;
/*使能GPIO的時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
/*初始化GPIOE.8*/
GPIO_InitTypeStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitTypeStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
GPIO_Init(GPIOE,&GPIO_InitTypeStructure);
}
void motor_init(void)
{
/*高級定時器輸出引腳初始化,輸出PWM波*/
TIM1_GPIO_init();
/*高級定時器初始化,設置PWM波*/
TIM1Init();
/*SD引腳初始化*/
SD_GPIO_Init();
}
主函數:
int main(void)
{
motor_init();
while(1)
{
}
}
硬件電路圖:
|