吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MM32F5270 TIM精準脈沖數量輸出

靈動MM32MCU ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2022-12-09 10:09 ? 次閱讀

脈沖信號用于設備控制是比較常見的,但在一些情況下,我們希望精準的控制脈沖的數量以實現對運動的精確控制,實現的方式也有多種多樣。定時器是單片機內部最基礎且常用的外設,有著非常豐富的功能,如輸入功能(測量輸入信號的脈沖寬度、頻率,PWM 輸入等),輸出功能(PWM 輸出、死區時間可編程的互補輸出、 單脈沖模式輸出等) ,容易想到使用定時器輸出PWM來實現此類操作。

MM32F5270系列集成有豐富的外設模塊,其中定時器部分包括 2 個 16 位高級定時器, 2 個 16 位通用定時器、 2 個 32 位通用定時器, 2 個 16 位基礎定時器和1 個低功耗定時器。以TIM1為例,該模塊主要由輸入單元、輸出單元、時基單元、捕獲/比較模塊、剎車單元等結構組成,功能框圖如下:

7d80cbda-7709-11ed-8abf-dac502259ad0.png

這里以MM32F5270定時器應用為例,介紹幾種常用的精準輸出脈沖數量的方法:

1?中斷計數方式

定時器配置為PWM輸出模式,在PWM中斷程序中計數,判斷PWM輸出次數達到設定值時,停止PWM輸出。

中斷計數的方式實現起來簡單,但也存在明顯的缺點。當PWM頻率較高時,頻繁的中斷將影響程序運行的效率,占用大量的MCU資源,這在大多數情況下是不可接受的。以下幾種方式較為優化。

2?定時器單脈沖重復計數

定時器單脈沖輸出是定時器比較輸出中的一種模式,在定時器比較輸出模式的基礎上進行配置。單脈沖模式(OPM)下,計數器響應一個激勵,產生一個脈寬可調的脈沖。配置 TIMx_CR1 寄存器的OPM=1,選擇單脈沖模式。

7daec9c2-7709-11ed-8abf-dac502259ad0.png

單脈沖模式可以使定時器輸出1個脈沖,而重復計數器可以用來調整更新事件產生的頻率。

邊沿對齊模式下,向上計數時,重復計數器在計數器每次上溢時遞減;向下計數時,重復計數器在計數器每次下溢時遞減。中央對齊模式下,重復計數器在計數器上溢和下溢時皆遞減。通過配置 TIMx_RCR 寄存器的 REP 來調整更新事件產生的頻率,重復計數器在 REP+1 個計數周期后產生更新事件。

7dc99be4-7709-11ed-8abf-dac502259ad0.png

配置TIM1輸出PWM,使能單脈沖模式,配置REP(重復計數器的值)為9,即TIM1在輸出10個脈沖后發生更新事件,相關代碼如下:

voidTIM1_Monopulse_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStruct;
TIM_OCInitTypeDefTIM_OCInitStruct;
TIM_ICInitTypeDefTIM_ICInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2ENR_TIM1,ENABLE);
TIM_DeInit(TIM1);
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
TIM_TimeBaseStruct.TIM_Period=arr;
TIM_TimeBaseStruct.TIM_Prescaler=psc;
TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_RepetitionCounter=9;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStruct);

TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=arr/2;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1,&TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1,ENABLE);
TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);
TIM_SetCounter(TIM1,0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);

TIM_Cmd(TIM1,ENABLE);
}

邏輯分析儀接PA8(程序中配置PA8作為TIM1_CH1),觀測輸出波形如下:

7e1ae1c0-7709-11ed-8abf-dac502259ad0.png

由于REP只有8位,所以它最大是255,當然也可以進行一些判斷后再次賦值,目前只有高級定時器具有重復計數功能。

3?DMA方式

使用DMA功能更新PWM的輸出,DMA傳輸將數據從一個地址空間復制到另一個地址空間,提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。它允許不同速度的硬件裝置來溝通,而不需要依賴于MPU的大量中斷負載。該方式占用很少的MCU資源,實現脈沖發送的精確控制。

通過設置DMA傳輸數據的數量,可以控制發送的脈沖數。通過設置不同的裝載值和順序,可以使用不同頻率和脈寬。

TIMx_DCR 和 TIMx_DMAR 寄存器跟 DMA 模式相關。DMA 控制器的目標是唯一的,必須指向TIMx_DMAR 寄存器。開啟 DMA 使能后,在給定的 TIMx 事件發生時, TIMx 會給 DMA 發送請求。對TIMx_DMAR 寄存器的每次寫操作都被重定向到一個 TIMx 寄存器。

TIMx_DMAR 連續模式 DMA 地址寄存器:

7e4013aa-7709-11ed-8abf-dac502259ad0.png

TIMx_DCR DMA 控制寄存器:

7e5cbc1c-7709-11ed-8abf-dac502259ad0.png

程序中配置TIM1的更新周期為10ms。

TIM1_PWM_Init(10000-1,SystemCoreClock/1000000-1);

定義一個數組,元素的數量表示可以控制發送的脈沖數,元素的值表示脈寬。

staticu16data[10]={1000,2000,3000,4000,5000,6000,7000,8000,9000,0};

配置TIM1輸出PWM,相關代碼同上,使能COM的DMA請求,配置DMA初始化,使能DMA傳輸完成中斷,TIM1_CH1對應DMA1_Channel2。

voidTIM1_DMA_Init(void)
{
DMA_InitTypeDefDMA_InitStruct;
DMA_Channel_TypeDef*channel;
channel=DMA1_Channel2;
RCC_DMA_ClockCmd(DMA1,ENABLE);

DMA_DeInit(channel);
DMA_StructInit(&DMA_InitStruct);
//Transferregisteraddress
DMA_InitStruct.DMA_PeripheralBaseAddr=(u32)&(TIM1->CCR1);
//Transfermemoryaddress
DMA_InitStruct.DMA_MemoryBaseAddr=(u32)data;
//Transferdirection,frommemorytoregister
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;
DMA_InitStruct.DMA_BufferSize=10;
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
//Transfercompletedmemoryaddressincrement
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//DMA_Mode_Circular;
DMA_InitStruct.DMA_Priority=DMA_Priority_High;
DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
DMA_InitStruct.DMA_Auto_reload=DMA_Auto_Reload_Disable;
DMA_Init(channel,&DMA_InitStruct);

DMA_ITConfig(channel,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA1_Channel2,ENABLE);
}

DMA中斷服務子程序:

voidDMA1_Channel2_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC2)){
DMA_ClearITPendingBit(DMA1_IT_TC2);
TIM_Cmd(TIM1,DISABLE);
}
}

邏輯分析儀接PA8(程序中配置PA8作為TIM1_CH1),觀測輸出波形如下:

7e78c6a0-7709-11ed-8abf-dac502259ad0.png

輸出9個脈沖,脈寬分別為10%、20%、30%......90%。

DMA方式算是一個很確定的方式,不會丟失脈沖。當需要發送較多數量的脈沖時,則可以使用DMA傳輸完成中斷中切換DMA傳輸的數據起始地址及發送數量。

4?主從模式

定時器同步功能可以配置多個定時器在內部相連。

利用定時器的主從模式,即一個是主定時器,一個是從定時器,由主定時器輸出脈沖信號,主定時器產生的更新觸發傳遞給從定時器進行計數,溢出時觸發從定時器的中斷服務函數。通過主從定時器進行設定,不占用主程序時鐘,且能精準控制。

主從關系要遵循參考手冊中所提供的配置,TIMx之間的互聯:

7ea82792-7709-11ed-8abf-dac502259ad0.png

參考TIMx_CR2和TIMx_SMCR寄存器配置主從模式。

TIMx_CR2 控制寄存器 2:

7ecf52ae-7709-11ed-8abf-dac502259ad0.png

TIMx_SMCR 從模式控制寄存器:

7f04f512-7709-11ed-8abf-dac502259ad0.png7f2249fa-7709-11ed-8abf-dac502259ad0.png

配置TIM1為主模式,輸出PWM:

voidTIM1_Master_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStruct;
TIM_OCInitTypeDefTIM_OCInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2ENR_TIM1,ENABLE);

TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
TIM_TimeBaseStruct.TIM_Period=arr;
TIM_TimeBaseStruct.TIM_Prescaler=psc;
TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStruct);

TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=499;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC1Init(TIM1,&TIM_OCInitStruct);

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1,ENABLE);
TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM1,TIM_TRIGSource_Update);

TIM_SetCounter(TIM1,0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE);
}

配置TIM3為從模式,選擇ITR0觸發(對應內部觸發源TIM1),使能更新中斷:

voidTIM3_Slave_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM3,ENABLE);

TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
TIM_TimeBaseStruct.TIM_Period=arr;
TIM_TimeBaseStruct.TIM_Prescaler=psc;
TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);

TIM_ARRPreloadConfig(TIM3,DISABLE);

TIM_SelectInputTrigger(TIM3,TIM_TS_ITR0);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1);
TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);

TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM3,ENABLE);
}

TIM3控制脈沖數量,此處設置為10:

TIM3_Slave_Init(10,0);

TIM3中斷服務子程序:

voidTIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_CtrlPWMOutputs(TIM1,DISABLE);
TIM_Cmd(TIM1,DISABLE);
TIM_Cmd(TIM3,DISABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
}
}

邏輯分析儀接PA8(程序中配置PA8作為TIM1_CH1),觀測輸出波形如下:

802da2cc-7709-11ed-8abf-dac502259ad0.png

TIM1輸出10個脈沖后停止。

以上簡要列舉了幾種控制脈沖數量輸出的方式,以MM32F5270為例演示其實現的可行性。在實際應用中,幾種方法各有優缺點,具體的方式還需要根據資源和需求進行綜合考慮。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5198

    瀏覽量

    214890
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115381
  • Tim
    Tim
    +關注

    關注

    0

    文章

    81

    瀏覽量

    17956
  • 脈沖信號
    +關注

    關注

    6

    文章

    400

    瀏覽量

    37078

原文標題:靈動微課堂 (第239講)|MM32F5270 TIM 精準脈沖數量輸出

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MM32F5270平臺ADC注入通道的單周期采樣的實現

    MM32F5270的ADC可配置4個注入通道來擴展轉換通道,那么可進行轉換的通道最多可達20個。
    的頭像 發表于 06-01 17:25 ?1539次閱讀
    <b class='flag-5'>MM32F5270</b>平臺ADC注入通道的單周期采樣的實現

    一文解析MM32F5270開發板+PWM測試與調制

    1、MM32F5270開發板+ PWM測試與調制  PWM接口引腳  MM32F5270開發板有引出PWM引腳給我們,我們可以直接使用就行。  主要代碼部分如下  2.1 hal_tim
    發表于 09-06 11:24

    MM32F5270是如何通過MindSwitch和CLU實現可任意編程外設間互聯系統的

    支持 OR-OR 邏輯操作。下表整理了 MM32F5270 中的所有源和目標的數量和類別,具體列表可參考芯片的用戶手冊。組合邏輯單元 CLU上文已經提到過 MindSwitch 中內置了 4 個
    發表于 09-06 15:13

    介紹幾種MM32F5270定時器常用的精準輸出脈沖數量的方法

    單元、輸出單元、時基單元、捕獲/比較模塊、剎車單元等結構組成,功能框圖如下:這里以MM32F5270定時器應用為例,介紹幾種常用的精準輸出脈沖數量
    發表于 12-30 16:28

    MM32F5270總線架構設計

    本文介紹了MM32F5270 中所采用的多并發總線架構,并通過帶顯示的音頻播放器的實例說明了該架構在實際應用中所能達到的吞吐率提升效果。
    的頭像 發表于 05-11 11:15 ?2224次閱讀
    <b class='flag-5'>MM32F5270</b>總線架構設計

    基于MM32F5270控制器的I2S音頻播放

    MM32F5270 系列控制器支持 I2S 總線接口,本章節在接下來會對 MM32F5270 I2S進行介紹,并使用 MM32F5270 和 CS4344 芯片進行 I2S 通信來演示播放一段聲音。
    的頭像 發表于 09-16 10:39 ?2451次閱讀

    MM32F5270】Keil開發環境搭建

    本文是對MM32F5270相關的靈動官網資料和社區現有幾篇環境搭建帖的整理和總結。詳細且完整的記錄了——如何從零搭建MM32F5270 Keil開發環境以及如何編譯運行MM32F5270 SDK中
    的頭像 發表于 11-06 16:14 ?2965次閱讀
    【<b class='flag-5'>MM32F5270</b>】Keil開發環境搭建

    MM32F5270 產品手冊(中文版)

    MM32F5270 產品手冊(中文版)
    發表于 02-23 18:45 ?0次下載
    <b class='flag-5'>MM32F5270</b> 產品手冊(中文版)

    MM32F5270 產品手冊(英文版)

    MM32F5270 產品手冊(英文版)
    發表于 02-23 18:45 ?0次下載
    <b class='flag-5'>MM32F5270</b> 產品手冊(英文版)

    MM32F5270 用戶手冊(中文版)

    MM32F5270 用戶手冊(中文版)
    發表于 02-23 18:46 ?0次下載
    <b class='flag-5'>MM32F5270</b> 用戶手冊(中文版)

    MM32F5270 用戶手冊(英文版)

    MM32F5270 用戶手冊(英文版)
    發表于 02-23 18:46 ?0次下載
    <b class='flag-5'>MM32F5270</b> 用戶手冊(英文版)

    MM32F5270 勘誤表(中文版)

    MM32F5270 勘誤表(中文版)
    發表于 02-23 18:47 ?0次下載
    <b class='flag-5'>MM32F5270</b> 勘誤表(中文版)

    MM32F5270 勘誤表(英文版)

    MM32F5270 勘誤表(英文版)
    發表于 02-23 18:48 ?0次下載
    <b class='flag-5'>MM32F5270</b> 勘誤表(英文版)

    MM32F5270平臺ADC注入通道的單周期采樣的實現

    MM32F5270的ADC可配置4個注入通道來擴展轉換通道,那么可進行轉換的通道最多可達20個。
    的頭像 發表于 05-26 09:32 ?985次閱讀
    <b class='flag-5'>MM32F5270</b>平臺ADC注入通道的單周期采樣的實現

    基于MM32F5270的I2S音頻播放

    基于MM32F5270的I2S音頻播放
    的頭像 發表于 10-30 17:13 ?1327次閱讀
    基于<b class='flag-5'>MM32F5270</b>的I2S音頻播放
    申博太阳城娱乐城| 百家乐官网注册送10彩金| 子山午向的房子24山图| 大发888投注技巧| 百家乐官网号技巧| 大发888皇冠娱乐城| 百家乐官网视频麻将| 百家乐投注平台信誉排行| 百家乐官网案件讯问| 澳门百家乐走势图怎么看| 乐亭县| 玩百家乐怎么能赢吗| 百家乐官网作弊演示| 最新百家乐出千赌具| 百家乐官网视频下载地址| 百威百家乐的玩法技巧和规则| 百家乐官网最好投注| 大发888怎么刷钱| 首席百家乐官网的玩法技巧和规则 | 屏南县| 百家乐开过的路纸| 潮州市| 送彩金百家乐的玩法技巧和规则| 澳门百家乐官网游戏皇冠网| 威尼斯人娱乐城求助| 网络百家乐官网路子玩| 澳门顶级赌场手机版| 属蛇和属猪做生意| 四川省| 中国百家乐软件| 百家乐官网走势图备用网站| 德州扑克女王| 赌百家乐的方法| 百家乐官网神仙道礼包| 百家乐娱乐场开户注册| 百家乐官网庄闲符号记| 娱乐城开户送金| 摩纳哥百家乐娱乐城| 百家乐官网群sun811| 明升娱乐场 | 678百家乐博彩娱乐网|