久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4471|回復: 7
收起左側

STM32高級定時器 如何讓通道和互補通道既可以輸PWM波,也可以輸出高電平

[復制鏈接]
ID:248175 發表于 2021-11-26 11:19 | 顯示全部樓層 |閱讀模式
大佬們 最近在做直流有刷電機的驅動,使用到STM32高級定時器TIM1的通道1和互補通道,電機的驅動模式采用單極模式,即驅動信號為1路的PWM,一路高電平,且這兩種信號通過按鈕可以交替實現電機的轉向。
我看的視頻是HAL庫編寫的驅動程序,使用的就是TIM1的通道1和互補通道,我編寫的庫函數版本跟BSP的結構大體相同,但是輸出的波形不是我想要的
我根據參考手冊將TIM1配置成MOE=1,,OSSR=1,然后用TIM_CCxNCmd()函數關閉互補通道,但是仿真輸出的還是低電平(非ST-link仿真),跟參考手冊說的這么不一樣?請問大佬們問題出在哪里?感謝回答
1.png 2.png
初始化程序如下:
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)
        {

        }
}



硬件電路圖:
3.png




回復

使用道具 舉報

ID:248175 發表于 2021-11-26 11:25 | 顯示全部樓層
紅色是我希望的波形,實際上是下面的波形。
4.jpg
回復

使用道具 舉報

ID:248175 發表于 2021-11-26 17:10 | 顯示全部樓層
啤酒瓶子老大 發表于 2021-11-26 16:56
曾經看到過一個介紹,手推車單片機PWM輸出高電平也不是很理想,在PWM的時候IO口是推挽的。索性直接加了個判 ...

不只是加個判斷那邊簡單,GPIO輸出PWM是在復用模式下,而要推挽輸出高電平需要再初始化一下GPIO。
我是想到用通道1和通道2,要高電平的時候吧占空比設置成100%。
但是我想知道通過互補通道能不能實現同樣的效果以及如何實現,拓寬一下知識面
回復

使用道具 舉報

ID:248175 發表于 2021-11-26 17:19 | 顯示全部樓層

RE: STM32高級定時器 如何讓通道和互補通道既可以輸PWM波,也可以輸出高電平

AUG 發表于 2021-11-26 17:12
不同的初始化就可以了,在每次要用不同功能的時候進行不同的初始化

好吧 大佬都這么做的嗎 那我試試
只不過我看參考手冊上有說只要把OSSR開啟,然后關閉互補通道就可以輸出高電平,我不知道我程序哪里錯了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内精品久久精品 | 午夜一区 | 国产日韩久久 | 成人欧美一区二区三区在线观看 | 啪啪综合网| 高清欧美性猛交xxxx黑人猛交 | 麻豆久久 | 久久精品视频99 | 99久久久久久99国产精品免 | 亚洲一区免费 | 久久亚洲综合 | 亚洲一区二区三区免费视频 | 欧美日韩福利视频 | 亚洲视频三区 | 亚洲色图第一页 | 国产精品99久久久久久宅男 | 粉色午夜视频 | 欧美一区二区三区日韩 | 精品国产乱码久久久久久牛牛 | 国产特级毛片aaaaaa喷潮 | www.99re| av中文字幕在线播放 | 九九热这里只有精品在线观看 | 91大神新作在线观看 | 一区二区视频 | 欧美一区2区三区4区公司 | 久久国产精品一区二区 | 久久免费看 | 毛片入口| 91高清在线 | 午夜激情视频 | 国产伦精品一区二区三区四区视频 | 老司机精品福利视频 | 欧美a视频| 亚洲免费视频在线观看 | 久久久久久国 | 91精品国产一区二区三区 | 久久最新 | 欧美日韩在线免费 | 国产高清性xxxxxxxx | 一级日韩 |