新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32單片機學習---PWM輸出

        STM32單片機學習---PWM輸出

        作者: 時間:2016-11-27 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/322220.htm

        下面是TIM配置函數,注釋很清楚了,不作說明:

        void tim2_cfg()
        {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

        TIM_DeInit(TIM2);
        TIM_InternalClockConfig(TIM2);
        //預分頻系數為72,這樣計數器時鐘為72MHz/72 = 1MHz
        TIM_TimeBaseStructure.TIM_Prescaler = 72;
        //設置時鐘分割
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        //設置計數器模式為向上計數模式
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        //設置計數溢出大小,每計1000個數就產生一個更新事件
        TIM_TimeBaseStructure.TIM_Period = 1000-1;
        //將配置應用到TIM2中
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

        //禁止ARR預裝載緩沖器
        TIM_ARRPreloadConfig(TIM2, DISABLE);

        TIM_Cmd(TIM2, ENABLE);//使能TIMx外設
        }

        接下來是關鍵的PWM的配置函數:

        void pwm_cfg()

        {

        //設置缺省值

        TIM_OCStructInit(&TimOCInitStructure);

        //PWM模式1輸出

        TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

        //設置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%

        TimOCInitStructure.TIM_Pulse = 400-1;

        //TIM輸出比較極性高

        TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

        //使能輸出狀態

        TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

        //TIM2的CH2輸出

        TIM_OC2Init(TIM2, &TimOCInitStructure);

        //設置TIM2的PWM輸出為使能

        TIM_CtrlPWMOutputs(TIM2,ENABLE);

        }

        stm32固件庫的輸出比較單元結構體與定時器的時基單元是分開定義的,而PWM模式只是輸出比較結構體成員TimOCInitStructure.TIM_OCMode的一個取值,當把此結構體填充完后,還要映射到某個定時器,用TIM_OCXInit函數實現,我用了一個X,說明不止一個這樣的函數,事實上,stm32的通用定時器都有四個通道,每個通道對應一個初始化函數,這里真夠糾結的!最后還要使能該定時器的PWM輸出功能,TIM_CtrlPWMOutputs(TIM2,ENABLE)函數要注意,是outputs而不是output,說明TIM2不止一個通道嘛!夠復雜,夠繁瑣的!

        下面是輸出比較單元的結構體原型:

        typedef struct
        {
        uint16_t TIM_OCMode;

        uint16_t TIM_OutputState;

        uint16_t TIM_OutputNState;

        uint16_t TIM_Pulse;

        uint16_t TIM_OCPolarity;

        uint16_t TIM_OCNPolarity;

        uint16_t TIM_OCIdleState;

        uint16_t TIM_OCNIdleState;
        } TIM_OCInitTypeDef;

        其中沒有加色的成員是高級定時器才有的,通用定時器就不用管了。

        這里還有個TimOCInitStructure.TIM_OCPolarity成員需要注意,它有什么作用呢?在網上查的資料,如下圖:

        前面說到pwm有pwm1和pwm2兩種模式,這兩種模式只能控制到OCXREF為止,TIM_OCPolarity 能控制OC1是直接等于OCXREF,還是取反極性!OC1才是最終的PWM信號。

        這里有個小插曲,我用示波器去測量PWM信號,發現信號居然是雙極性的,然后改變TIM_OCPolarity ,再測,還是雙極性,只是倒了個跟頭。還真以為stm32單片機能輸出兩極性的PWM,后面把示波器改為直流檔(之前用的是交流檔),波形才從零電位一下縱向移上去。以后要注意!


        上一頁 1 2 下一頁

        關鍵詞: STM32單片機PWM輸

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大关县| 潞西市| 改则县| 德钦县| 雅江县| 文安县| 定安县| 石台县| 文昌市| 城固县| 北京市| 沅陵县| 长顺县| 沛县| 岢岚县| 句容市| 吉水县| 邛崃市| 普格县| 玛沁县| 凤冈县| 双流县| 威海市| 罗田县| 东山县| 兴化市| 博湖县| 云南省| 灌云县| 青海省| 平陆县| 萨嘎县| 遂平县| 鹤庆县| 兴城市| 建宁县| 丘北县| 泾川县| 融水| 密云县| 太湖县|