新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的PWM輸入模式

        STM32的PWM輸入模式

        作者: 時間:2016-11-27 來源:網絡 收藏
        這個程序用的是PWM輸入模式,該模式是輸入捕獲模式的一個特例,除了下列區別外,工作過程序與輸入捕獲模式一樣的。

        2個ICx信號映射到同一下TIxl輸入(這里是CH1及CH2)。
        這兩個ICx信號都為邊沿有效,但極性相反。

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

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter = 0x0;

        由上面程序可知,TIM2的TIM_Channel_2被配置為上升沿觸發,則TIM2的TIM_Channel_1被配為下降沿觸發。

        利用此模式能夠測量輸入到TI1上的PWM信號的長度(TIMx_CCR2寄存器)和占空比(TIMx_CCR1)數值;

        在測量時,當上升沿信號觸發后,TIMx_CCR2寄存器開始計數,當下降沿出現時,TIMx_CCR1寄存器也開始計數。

        直到下一個上升沿信號出現時,在中斷里記下TIM2_CCR1(TIM_GetCapture1(TIM2))及TIM2_CCR2(TIM_GetCapture1(TIM2))的值,然后根據這兩個值算出點空比TIM_GetCapture1(TIM2)/2C1Value ,頻率=系統時鐘/2C1Value 。

        中斷程序如下所示:
        void TIM2_IRQHandler(void)
        {

        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);


        IC2Value = TIM_GetCapture2(TIM2);

        if (IC2Value != 0)
        {

        DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;


        Frequency = 72000000 / IC2Value;
        }
        else
        {
        DutyCycle = 0;
        Frequency = 0;
        }
        }

        在輸入信號的每一次上升沿都會觸發中斷,在中斷對IC2Value及IC1Value的值進行計算

        在這個程序中,TIM2的通道2設置為上升沿觸發中斷,TIM2的預分頻為0,因此可以得到:
        輸入信號的頻率Frequency = 72000000 / IC2Value;
        輸入信號的點空比 DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;


        再簡要解釋一下:不管是用一個通道還是2個通道,都是要使用輸入捕獲來實現測量脈寬。

        輸入捕獲的意思是,當計數器不斷地計數時,在指定的邊沿到來時刻,把計數器的內容拷貝到這個通道對應的CCR寄存器,同時計數器還會繼續不斷地計數。

        當使用一個通道測量脈寬時,你需要先指定上升沿觸發捕獲,當產生捕獲中斷時,讀出CCR寄存器的內容,再改變這個通道為下降沿捕獲,當再次產生捕獲中斷時,再讀出CCR寄存器的內容并與上次的捕獲數值相減,結果就是脈寬。

        當使用2個通道測量脈寬時,你只需要指定一個通道為上升沿觸發捕獲,另一個通道為下降沿捕獲,計算方法與使用一個通道時相同,即把下降沿捕獲的數值減去上升沿捕獲的數值,結果就是脈寬。使用2個通道的好處是,在產生捕獲中斷時不必改變觸發捕獲的邊沿。


        關鍵詞: STM32PWM輸入模

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 旅游| 黔西县| 安西县| 台山市| 滕州市| 仲巴县| 遂平县| 申扎县| 前郭尔| 康平县| 蛟河市| 土默特左旗| 基隆市| 扎兰屯市| 扬中市| 全南县| 望奎县| 界首市| 乾安县| 宁晋县| 前郭尔| 辰溪县| 奉新县| 循化| 宁安市| 托里县| 贵州省| 上高县| 大同市| 竹溪县| 科技| 鹿邑县| 彭阳县| 兴和县| 望城县| 文化| 兴化市| 石门县| 鹤庆县| 盐津县| 陇西县|