0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

電機(jī)控制基礎(chǔ)3——定時(shí)器編碼器模式使用與轉(zhuǎn)速計(jì)算

碼農(nóng)愛(ài)學(xué)習(xí) ? 來(lái)源:碼農(nóng)愛(ài)學(xué)習(xí) ? 作者:碼農(nóng)愛(ài)學(xué)習(xí) ? 2021-08-30 17:26 ? 次閱讀

上篇介紹了定時(shí)器捕獲輸入脈沖的原理,那種方式是根據(jù)捕獲的原理,手動(dòng)切換上升沿與下降沿捕獲,計(jì)算脈沖寬度的過(guò)程原理比較清晰,但編程操作起來(lái)比較麻煩。

對(duì)于電機(jī)測(cè)速用到的正交編碼器,測(cè)速時(shí)需要捕獲2路脈沖,如果使用上一篇介紹的方法,編程就較為復(fù)雜。還好單片機(jī)的通用定時(shí)器具有專(zhuān)門(mén)的正交編碼器接口,只需配置相應(yīng)的寄存器,就可實(shí)現(xiàn)編碼器輸入的上下沿自動(dòng)捕獲與計(jì)數(shù),非常便于編碼器的測(cè)速。

下面就來(lái)介紹下定時(shí)器的編碼器模式的使用:

1 正反轉(zhuǎn)計(jì)數(shù)原理示例

編碼器模式下,計(jì)數(shù)器的計(jì)數(shù)方向代表的電機(jī)的正轉(zhuǎn)與反轉(zhuǎn),計(jì)數(shù)的大小代表了轉(zhuǎn)速的大小。

如下圖,電機(jī)正轉(zhuǎn)時(shí),編碼器的通道A(TI1)的信號(hào)超前通道B,計(jì)數(shù)器向上計(jì)數(shù),反轉(zhuǎn)時(shí),通道A的信號(hào)滯后,向下計(jì)數(shù)。

pYYBAGD1h8uANRcpAADGZTY2jto184.png

設(shè)置信號(hào)的極性反相,可以使向下計(jì)數(shù)代表電機(jī)正轉(zhuǎn)。 pYYBAGD1h8yAK37zAADMFtGqpgU094.png

2 定時(shí)器編碼器模式配置

STM32 芯片為例,其內(nèi)部有專(zhuān)門(mén)用來(lái)采集增量式編碼器方波信號(hào)的接口,這些接口實(shí)際上是STM32 定時(shí)器的其中一種功能。不過(guò)編碼器接口功能只有高級(jí)定時(shí)器TIM1、TIM8 和通用定時(shí)器的TIM2~TIM5 才有。

poYBAGD1h8yASOHSAABThnF_A_Q810.png

正交編碼器有兩路正交的輸入信號(hào)(關(guān)于正交編碼的介紹,可查看之前的文章:編碼器計(jì)數(shù)原理與電機(jī)測(cè)速原理——多圖解析),根據(jù)實(shí)際需要,可以設(shè)置只捕獲某個(gè)通道的上升沿或下降沿,也可以設(shè)置同時(shí)捕獲兩個(gè)通道的上升沿與下降沿,這樣就可以提高編碼器的計(jì)數(shù)精度,實(shí)現(xiàn)倍頻。

poYBAGD1h86AGQl5AAHT3hSvsRU643.png

編碼器模式的配置實(shí)際上是通過(guò)配置SMCR寄存器和CCER寄存器來(lái)實(shí)現(xiàn)。

2.1 SMCR寄存器配置觸發(fā)模式

SMCR即從模式控制寄存器(slave mode control register),查閱STM32F4的參考手冊(cè),可以找到類(lèi)似如下信息,現(xiàn)在我們只需關(guān)注SMS這幾位:

pYYBAGD1h8-ALsBCAAAfFpmZIBA157.png

  • 位 15 ETP:外部觸發(fā)極性 (External trigger polarity)

  • 位 14 ECE:外部時(shí)鐘使能 (External clock enable)

  • 位 13:12 ETPS:外部觸發(fā)預(yù)分頻器 (External trigger prescaler)

  • 位 11:8 ETF[3:0]:外部觸發(fā)濾波器 (External trigger filter)

  • 位 7 MSM:主/從模式 (Master/Slave mode)

  • 位 6:4 TS:觸發(fā)選擇 (Trigger selection)

  • 位 3 保留,必須保持復(fù)位值

  • 位 2:0 SMS:從模式選擇 (Slave mode selection)

    • 000:禁止從模式––如果 CEN =“1”,預(yù)分頻器時(shí)鐘直接由內(nèi)部時(shí)鐘提供。

    • 001:編碼器模式 1––計(jì)數(shù)器根據(jù) TI1FP1 電平在 TI2FP2 邊沿 遞增/遞減計(jì)數(shù)。

    • 010:編碼器模式 2––計(jì)數(shù)器根據(jù) TI2FP2 電平在 TI1FP1 邊沿 遞增/遞減計(jì)數(shù)。

    • 011:編碼器模式 3––計(jì)數(shù)器在 TI1FP1 和 TI2FP2 的邊沿計(jì)數(shù),計(jì)數(shù)的方向取決于另外一個(gè)信號(hào)的電平。

    • 100:復(fù)位模式––在出現(xiàn)所選觸發(fā)輸入 (TRGI) 上升沿時(shí),重新初始化計(jì)數(shù)器并生成一個(gè)寄存器更新事件。

    • 101:門(mén)控模式––觸發(fā)輸入 (TRGI) 為高電平時(shí)使能計(jì)數(shù)器時(shí)鐘。只要觸發(fā)輸入變?yōu)榈碗娖?,?jì)數(shù)器立即停止計(jì)數(shù)(但不復(fù)位)。計(jì)數(shù)器的啟動(dòng)和停止都是受控的。

    • 110:觸發(fā)模式––觸發(fā)信號(hào) TRGI 出現(xiàn)上升沿時(shí)啟動(dòng)計(jì)數(shù)器(但不復(fù)位)。只控制計(jì)數(shù)器的啟動(dòng)。

    • 111:外部時(shí)鐘模式 1––由所選觸發(fā)信號(hào) (TRGI) 的上升沿提供計(jì)數(shù)器時(shí)鐘。

上面的SMCR寄存器介紹中,關(guān)于TI1、TI2等的函數(shù):

TI1TI2對(duì)應(yīng)編碼器的A、B兩相輸入信號(hào)。

TI1FP1TI2FP2 是進(jìn)行輸入濾波器和極性選擇后 TI1 和 TI2 的信號(hào),如果不進(jìn)行濾波和反相,則 TI1FP1=TI1,TI2FP2=TI2。

從上面的SMCR寄存器的功能介紹可知,選擇編碼器接口模式時(shí):

如果計(jì)數(shù)器僅在 TI2 邊沿處計(jì)數(shù),在 TIMx_SMCR 寄存器中寫(xiě)入 SMS=001

如果計(jì)數(shù)器僅在 TI1 邊沿處計(jì)數(shù),寫(xiě)入 SMS=010

如果計(jì)數(shù)器在 TI1 和 TI2 邊沿處均計(jì)數(shù),則寫(xiě)入 SMS=011

定時(shí)器的編碼器模式根據(jù)兩個(gè)輸入的信號(hào)轉(zhuǎn)換序列,產(chǎn)生計(jì)數(shù)脈沖方向信號(hào)。根據(jù)該信號(hào)轉(zhuǎn)換序列,計(jì)數(shù)器相應(yīng)遞增或遞減計(jì)數(shù),同時(shí)硬件對(duì) TIMx_CR1 寄存器的DIR位進(jìn)行相應(yīng)修改。任何輸入(TI1 或 TI2)發(fā)生信號(hào)轉(zhuǎn)換時(shí),都會(huì)計(jì)算 DIR 位。

2.2 CCER寄存器配置極性

通過(guò)編程 TIMx_CCER 寄存器的 CC1P 和 CC2P 位,可以選擇 TI1 和 TI2 極性。實(shí)際上就是設(shè)置TIxFP1 是否與TIx反相,來(lái)設(shè)置正轉(zhuǎn)時(shí)是向下計(jì)數(shù)還是向下計(jì)數(shù)。

pYYBAGD1h8-APBX7AAAqgbJouDE651.png

  • 位 15、11、7、3 CCxNP:捕獲 /比較x 輸出極性 (Capture/Comparex output Polarity)

  • 位 14、10、6、2 保留,必須保持復(fù)位值

  • 位 13、9、5、1 CCxP:捕獲 /比較x 輸出極性 (Capture/Comparex output Polarity)。

    • 00:非反相/上升沿觸發(fā)電路對(duì) TIxFP1 上升沿敏感(在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作), TIxFP1 未反相 (在門(mén)控模式或編碼器模式下執(zhí)行觸發(fā)操作)。

    • 01:反相/下降沿觸發(fā) 電路對(duì) TIxFP1 下降沿敏感 (在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作), TIxFP1 反相 (在門(mén)控模式或編碼器模式下執(zhí)行觸發(fā)操作)。

    • 10:保留,不使用此配置。

    • 11:非反相/上升沿和下降沿均觸發(fā) 電路對(duì) TIxFP1 上升沿和下降沿都敏感(在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作),TIxFP1 未反相(在門(mén)控模式下執(zhí)行觸發(fā)操作)。編碼器模式下不得使用此配置!!!

    • 0:OCx 高電平有效

    • 1:OCx低電平有效

    • CCx 通道配置為輸出:

    • CCx 通道配置為輸入

      CCxNP/CCxP 位可針對(duì)觸發(fā)或捕獲操作選擇 TI1FP1 和 TI2FP1 的極性。

  • 位 12、8、4、0 CCxE:捕獲 /比較 x 輸出使能 (Capture/Comparex output enable)

注:在編碼器模式下,極性的作用是設(shè)置TIxFP1 是否反相,不要被”上升沿敏感“誤導(dǎo)為是只捕獲上升沿信號(hào)!

”上升沿敏感“是在非編碼器模式下的功能。所以,編碼模式下,只能配置為0001。

另一方面來(lái)看,編碼器模式下,只能通過(guò)SMCR的模式設(shè)置倍頻,要么是2倍頻,要么是4倍頻,貌似不能設(shè)置1倍頻(只對(duì)1個(gè)通道的上升沿或下降沿計(jì)數(shù))。

2.3 CCMR寄存器配濾波參數(shù)

如果需要,通過(guò)配置CCMR寄存器的IC1F與IC2F,還可以對(duì)編碼器輸入信號(hào)進(jìn)行濾波配置:

poYBAGD1h9CAGztaAABGDNkRr5A684.png

這些寄存器的說(shuō)明在上篇文章已有介紹,這里不再展開(kāi)。

3 計(jì)數(shù)方向?qū)φ毡斫庾x

編碼器模式下,計(jì)數(shù)器的計(jì)數(shù)方向(遞增計(jì)數(shù)還是遞減計(jì)數(shù))會(huì)根據(jù)增量編碼器的速度和方向自動(dòng)進(jìn)行修改,因此,其計(jì)數(shù)值始終表示編碼器的位置。計(jì)數(shù)方向?qū)?yīng)于所連傳感器的旋轉(zhuǎn)方向。下表匯總了可能的組合(假設(shè) TI1 和 TI2 不同時(shí)切換)。

poYBAGD1h9KAFx7SAAFO9hveg4A411.png

注:STM32 的編碼器接口在計(jì)數(shù)的時(shí)候,并不是單純采集某一通道信號(hào)的上升沿或下降沿,而是需要綜合另一個(gè)通道信號(hào)的電平。(通俗的講就是,使用編碼器接口時(shí),編碼器的兩個(gè)輸入通道A與通道B都需要進(jìn)行電路連接?。。?/strong>,雖然你設(shè)置了僅在某一個(gè)通道上計(jì)數(shù),但這個(gè)通道的計(jì)數(shù)時(shí)機(jī)需要參考另一路通道的信號(hào))表中“相反信號(hào)的電平”指的就是在計(jì)數(shù)的時(shí)候所參考的另一個(gè)通道信號(hào)的電平,這些電平?jīng)Q定了計(jì)數(shù)器的計(jì)數(shù)方向。

3.1 僅在TI1處計(jì)數(shù)

這里的僅在TI1處計(jì)數(shù),就是僅統(tǒng)計(jì)編碼器的通道A的信號(hào)跳變,先以電機(jī)正轉(zhuǎn)為例:

注:以下的介紹中,“通道A“代表TI1,“通道B“代表TI2。

3.1.1 電機(jī)正轉(zhuǎn)(向上計(jì)數(shù))

假定電機(jī)正轉(zhuǎn)時(shí),編碼的通道A的信號(hào)比通道B提前1/4個(gè)周期(也即相位提前90度),在通道A的上升沿與下降沿均計(jì)數(shù)(如下圖TI1波形中的綠色和紅色箭頭),因?yàn)?/span>計(jì)數(shù)的方向代表的電機(jī)轉(zhuǎn)動(dòng)的方向,所以,在正轉(zhuǎn)的情況下:

  • 通道A上升沿,通道B為低電平,向上計(jì)數(shù),代表電機(jī)正轉(zhuǎn)

  • 通道A下降沿,通道B為高電平,向上計(jì)數(shù),代表電機(jī)正轉(zhuǎn)

pYYBAGD1h9OAEx3KAAJhXG1DgCA568.png

3.1.2 電機(jī)反轉(zhuǎn)(向下計(jì)數(shù))

反轉(zhuǎn)的情況,編碼的通道A的信號(hào)比通道B滯后1/4個(gè)周期:

  • 通道A下降沿,通道B為低電平,向上計(jì)數(shù),代表電機(jī)反轉(zhuǎn)

  • 通道A上升沿,通道B為高電平,向上計(jì)數(shù),代表電機(jī)反轉(zhuǎn)

pYYBAGD1h9WAGl2uAAIg4g1WsLs637.png

3.2 僅在TI2處計(jì)數(shù)

僅在TI2處計(jì)數(shù),就是僅統(tǒng)計(jì)編碼器的通道B的信號(hào)跳變,同樣可以分為正轉(zhuǎn)和反轉(zhuǎn)兩種情況,具體的對(duì)應(yīng)關(guān)系參考上面的”僅在TI1處計(jì)數(shù)“自行分析,實(shí)際上通道A與通道B從自身來(lái)說(shuō)功能是等價(jià)的。

3.3 在TI1與TI2處均計(jì)數(shù)

在TI1與TI2處均計(jì)數(shù),就是講編碼器的通道A與通道B的信號(hào)均統(tǒng)計(jì)并進(jìn)行計(jì)數(shù),這樣可以提高計(jì)數(shù)頻率,實(shí)現(xiàn)倍頻。

這里還以電機(jī)正轉(zhuǎn)為例*

觀察下圖,編碼器在開(kāi)始階段可依次捕獲到:通道A上升沿、通道B上升沿、通道A下降沿、通道B下降沿,所以有:

  • 通道A上升沿,通道B為低電平,向上計(jì)數(shù),代表電機(jī)正轉(zhuǎn)

  • 通道B上升沿,通道A為高電平,向上計(jì)數(shù),代表電機(jī)正轉(zhuǎn)

  • 通道A下降沿,通道B為高電平,向上計(jì)數(shù),代表電機(jī)正轉(zhuǎn)

  • 通道B下降沿,通道A為高電平,向上計(jì)數(shù),代表電機(jī)正轉(zhuǎn)

poYBAGD1h9aAa1WQAAKMTTsmhrc747.png

4 編程實(shí)現(xiàn)

4.1 定時(shí)器編碼器模式配置

這里使用的通用定時(shí)器中的 TIM4,配置定時(shí)器最基礎(chǔ)的功能就是要配置時(shí)基,使用輸入功能還要配置定時(shí)器的GPIO輸入通道。

#define ENCODER_TIM_PSC 0     /*計(jì)數(shù)器分頻*/
#define ENCODER_TIM_PERIOD 65535  /*計(jì)數(shù)器最大值*/
#define CNT_INIT 0         /*計(jì)數(shù)器初值*/

void TIM4_ENCODER_Init(void)           
{
GPIO_InitTypeDef GPIO_InitStruct;      /*GPIO*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; /*時(shí)基*/
TIM_ICInitTypeDef TIM_ICInitStruct;     /*輸入通道*/
 
 /*GPIO初始化*/  
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /*使能GPIO時(shí)鐘 AHB1*/          
GPIO_StructInit(&GPIO_InitStruct);    
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;    /*復(fù)用功能*/
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; /*速度100MHz*/
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; 
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;    
GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);

/*時(shí)基初始化*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  /*使能定時(shí)器時(shí)鐘 APB1*/
TIM_DeInit(TIM4); 
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);  
TIM_TimeBaseStruct.TIM_Prescaler = ENCODER_TIM_PSC;    /*預(yù)分頻 */    
TIM_TimeBaseStruct.TIM_Period = ENCODER_TIM_PERIOD;    /*周期(重裝載值)*/
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;   
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; /*連續(xù)向上計(jì)數(shù)模式*/ 
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct);

/*編碼器模式配置:同時(shí)捕獲通道1與通道2(即4倍頻),極性均為Rising*/
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM_ICInitStruct);    
TIM_ICInitStruct.TIM_ICFilter = 0;  /*輸入通道的濾波參數(shù)*/
TIM_ICInit(TIM4, &TIM_ICInitStruct); /*輸入通道初始化*/
TIM_SetCounter(TIM4, CNT_INIT);   /*CNT設(shè)初值*/
TIM_ClearFlag(TIM4,TIM_IT_Update);  /*中斷標(biāo)志清0*/
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); /*中斷使能*/
TIM_Cmd(TIM4,ENABLE);        /*使能CR寄存器*/
}

這里將定時(shí)器的計(jì)數(shù)溢出值設(shè)為65535,即TIM4的計(jì)數(shù)最大值(TIM4為16位計(jì)數(shù)器)。目的是避免計(jì)數(shù)器溢出,簡(jiǎn)化后續(xù)的速度計(jì)算方式(計(jì)數(shù)器器若溢出,在計(jì)算轉(zhuǎn)速時(shí),還要將溢出的次數(shù)考慮進(jìn)去)。

編碼器模式設(shè)置為TIM_EncoderMode_TI12,即兩路信號(hào)均計(jì)數(shù),實(shí)現(xiàn)4倍頻。

編碼器兩個(gè)輸入的極性均設(shè)置為TIM_ICPolarity_Rising,即極性不反相。

這里編碼器模式的設(shè)置,調(diào)用了TIM_EncoderInterfaceConfig()函數(shù),其內(nèi)部即是對(duì)相關(guān)的寄存器進(jìn)行配置:

void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
{
uint16_t tmpsmcr = 0;
uint16_t tmpccmr1 = 0;
uint16_t tmpccer = 0;
 
/* Check the parameters */
assert_param(IS_TIM_LIST2_PERIPH(TIMx));
assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode));
assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity));
assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity));

tmpsmcr = TIMx->SMCR;/* Get the TIMx SMCR register value */
tmpccmr1 = TIMx->CCMR1; /* Get the TIMx CCMR1 register value */
tmpccer = TIMx->CCER;/* Get the TIMx CCER register value */
tmpsmcr &= (uint16_t)~TIM_SMCR_SMS;/* Set the encoder Mode */
tmpsmcr |= TIM_EncoderMode;

/* Select the Capture Compare 1 and the Capture Compare 2 as input */
tmpccmr1 &= ((uint16_t)~TIM_CCMR1_CC1S) & ((uint16_t)~TIM_CCMR1_CC2S);
tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;

/* Set the TI1 and the TI2 Polarities */
tmpccer &= ((uint16_t)~TIM_CCER_CC1P) & ((uint16_t)~TIM_CCER_CC2P);
tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));

TIMx->SMCR = tmpsmcr; /* 配置數(shù)據(jù)寫(xiě)入 SMCR 寄存器 */
TIMx->CCMR1 = tmpccmr1; /* 配置數(shù)據(jù)寫(xiě)入 CCMR1 寄存器 */
TIMx->CCER = tmpccer; /* 配置數(shù)據(jù)寫(xiě)入 CCER 寄存器 */
}

4.2 電機(jī)轉(zhuǎn)軸轉(zhuǎn)速計(jì)算

這里使用一款直流減速電機(jī):

  • 減速比是34(即電機(jī)轉(zhuǎn)軸轉(zhuǎn)1圈,電機(jī)本身要轉(zhuǎn)34圈)

  • 電機(jī)轉(zhuǎn)一圈的物理脈沖數(shù)是11

所以,電機(jī)轉(zhuǎn)軸轉(zhuǎn)1圈時(shí),可以產(chǎn)生的物理脈沖為34*11=374個(gè),又由于編碼器器模式實(shí)現(xiàn)了4倍頻計(jì)數(shù),所以,電機(jī)轉(zhuǎn)軸轉(zhuǎn)1圈時(shí),定時(shí)器可以計(jì)數(shù)374×4=1496個(gè)。

對(duì)于轉(zhuǎn)速的計(jì)算,這里使用M法測(cè)速(M法測(cè)速的具體原理參考之前的文章:http://wenjunhu.com/d/1639052.html),即統(tǒng)計(jì)固定時(shí)間間隔內(nèi)的編碼器的脈沖數(shù),來(lái)計(jì)算速度值。

,單位為:轉(zhuǎn)/秒

  • C:編碼器單圈總脈沖數(shù)

  • 每次的統(tǒng)計(jì)時(shí)間(單位為秒)

  • :該時(shí)間內(nèi)統(tǒng)計(jì)到的編碼器脈沖數(shù)

比如,對(duì)于本次實(shí)驗(yàn)的電機(jī),轉(zhuǎn)軸轉(zhuǎn)1圈時(shí),定時(shí)器計(jì)數(shù)1496個(gè),即C=1496個(gè),對(duì)應(yīng)程序中的TOTAL_RESOLUTION。T0可以選擇100ms,即0.1s。

程序編寫(xiě)如下,這里通過(guò)另外一個(gè)定時(shí)器7來(lái)實(shí)現(xiàn)每100ms調(diào)用一次calc_motor_rotate_speed()函數(shù)來(lái)進(jìn)行轉(zhuǎn)速的實(shí)時(shí)計(jì)算,每次使用read_encoder()讀取編碼器器的值后,都將計(jì)數(shù)值CNT設(shè)為初始值0,重新開(kāi)始計(jì)數(shù),這樣就可以保證每次讀到的都是上個(gè)100ms的計(jì)數(shù)值。

另外,這里通過(guò)將CNT的uint32類(lèi)型的計(jì)數(shù)值, 轉(zhuǎn)為int16類(lèi)型,就可以利用正負(fù)來(lái)區(qū)分上個(gè)100ms電機(jī)整體的轉(zhuǎn)動(dòng)方向(正轉(zhuǎn)CNT從0向上計(jì)數(shù),轉(zhuǎn)為int16還是正值;反轉(zhuǎn)CNT從0向下計(jì)數(shù),會(huì)溢出,轉(zhuǎn)為int16就為負(fù)數(shù))。

#define ENCODER_RESOLUTION 11  /*編碼器一圈的物理脈沖數(shù)*/
#define ENCODER_MULTIPLE 4    /*編碼器倍頻,通過(guò)定時(shí)器的編碼器模式設(shè)置*/
#define MOTOR_REDUCTION_RATIO 34 /*電機(jī)的減速比*/
/*電機(jī)轉(zhuǎn)一圈總的脈沖數(shù)(定時(shí)器能讀到的脈沖數(shù)) = 編碼器物理脈沖數(shù)*編碼器倍頻*電機(jī)減速比 */
#define TOTAL_RESOLUTION ( ENCODER_RESOLUTION*ENCODER_MULTIPLE*MOTOR_REDUCTION_RATIO )

// 讀取定時(shí)器計(jì)數(shù)值
static int read_encoder(void)
{
int encoderNum = 0;
encoderNum = (int)((int16_t)(TIM4->CNT)); /*CNT為uint32, 轉(zhuǎn)為int16*/
TIM_SetCounter(TIM4, CNT_INIT);/*CNT設(shè)初值*/

return encoderNum;
}

//計(jì)算電機(jī)轉(zhuǎn)速(被另一個(gè)定時(shí)器每100ms調(diào)用1次)
void calc_motor_rotate_speed()
{
int encoderNum = 0;
float rotateSpeed = 0;

/*讀取編碼器的值,正負(fù)代表旋轉(zhuǎn)方向*/
encoderNum = read_encoder();
/* 轉(zhuǎn)速(1秒鐘轉(zhuǎn)多少圈)=單位時(shí)間內(nèi)的計(jì)數(shù)值/總分辨率*時(shí)間系數(shù) */
rotateSpeed = (float)encoderNum/TOTAL_RESOLUTION*10;

printf("encoder: %d\t speed:%.2f rps\r\n",encoderNum,rotateSpeed);
}

5 實(shí)驗(yàn)演示

通過(guò)串口發(fā)送指令,控制另外一個(gè)定時(shí)器產(chǎn)生指定占空比的PWM來(lái)控制電機(jī)進(jìn)行恒速轉(zhuǎn)動(dòng),然后測(cè)試編碼器讀到的速度值。

(串口指令用到了字符串切割和串口接收不定長(zhǎng)字符的功能,可參考之前的文章:與 中的部分內(nèi)容,PWM的產(chǎn)生可參考:)

視頻中,串口打印的encoder為100ms內(nèi)讀到的編碼器器的計(jì)數(shù)值,正負(fù)號(hào)代表正反轉(zhuǎn),speed為根據(jù)編碼器的計(jì)數(shù)值計(jì)算的電機(jī)輸出軸的轉(zhuǎn)速,單位為圈每秒。

首先是全速正反轉(zhuǎn),轉(zhuǎn)速接近5圈每秒。

然后通過(guò)調(diào)整pwm,使得電機(jī)轉(zhuǎn)軸轉(zhuǎn)速接近1圈每秒,由于轉(zhuǎn)1圈的脈沖理論上有1496個(gè),現(xiàn)在是每100ms讀一次,所以能讀到149個(gè)左右,符合理論值。

視頻演示:https://www.bilibili.com/video/BV13p4y1h7F9

20210307224431.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6039

    文章

    44573

    瀏覽量

    636294
  • 電機(jī)控制
    +關(guān)注

    關(guān)注

    3537

    文章

    1881

    瀏覽量

    268930
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3647

    瀏覽量

    134730
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3251

    瀏覽量

    114991
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用STM32的編碼器接口對(duì)接增量式編碼器控制電機(jī)進(jìn)行很低速的轉(zhuǎn)動(dòng)時(shí),需要如何進(jìn)行電機(jī)轉(zhuǎn)速的測(cè)量?

    使用STM32的編碼器接口對(duì)接增量式編碼器控制電機(jī)進(jìn)行很低速的轉(zhuǎn)動(dòng)時(shí),需要如何進(jìn)行電機(jī)轉(zhuǎn)速的測(cè)量
    發(fā)表于 04-30 06:05

    電機(jī)控制基礎(chǔ)之定時(shí)器編碼器模式使用與轉(zhuǎn)速計(jì)算

    上篇電機(jī)控制基礎(chǔ)——定時(shí)器捕獲單輸入脈沖原理介紹了定時(shí)器捕獲輸入脈沖的原理,那種方式是根據(jù)捕獲的原理,手動(dòng)切換上升沿與下降沿捕獲,計(jì)算脈沖寬
    發(fā)表于 06-29 07:15

    定時(shí)器編碼器AB相電機(jī)測(cè)速( 補(bǔ)充)精選資料下載

    TIM編碼器AB相電機(jī)測(cè)速定時(shí)器編碼器AB相電機(jī)測(cè)速1、四倍頻2、算法應(yīng)用定時(shí)器
    發(fā)表于 07-09 06:45

    編碼器模式的實(shí)現(xiàn)

    編碼器模式的實(shí)現(xiàn)編碼器模式默認(rèn)使用定時(shí)器的通道1和通道2,通道3和通道4不能使用。以下為
    發(fā)表于 08-16 08:12

    關(guān)于定時(shí)器編碼器的應(yīng)用

    實(shí)驗(yàn)?zāi)康模簞傞_(kāi)始接觸關(guān)機(jī)電機(jī)檢測(cè)領(lǐng)域,準(zhǔn)備探索關(guān)于定時(shí)器編碼器的應(yīng)用,用來(lái)檢測(cè)脈沖數(shù),從而進(jìn)行轉(zhuǎn)速的檢測(cè)。使用芯片:STM32F407使用平臺(tái):STM32Cube IDE1、使用
    發(fā)表于 08-19 07:32

    怎樣去使用STM32定時(shí)器編碼器模式

    STM32F103-定時(shí)器編碼器模式和高級(jí)定時(shí)器輸出互補(bǔ)的PWM信號(hào)剛使用STM32時(shí)使用輸入捕獲中斷的方式計(jì)算
    發(fā)表于 01-14 08:02

    定時(shí)器編碼器模式分析

    回顧上一章節(jié)學(xué)習(xí)了PWM生成,剛好買(mǎi)的元器件也都到了。測(cè)試下代碼,完美運(yùn)行。這不又趁著周末,進(jìn)行下一個(gè)環(huán)節(jié)—定時(shí)器編碼器模式。目的是為下一步PID控制做準(zhǔn)備。遇到的問(wèn)題周末學(xué)習(xí)
    發(fā)表于 01-14 08:08

    電機(jī)控制知識(shí)——定時(shí)器編碼器模式的使用

    產(chǎn)生的物理脈沖為34*11=374個(gè),又由于編碼器模式實(shí)現(xiàn)了4倍頻計(jì)數(shù),所以,電機(jī)轉(zhuǎn)軸轉(zhuǎn)1圈時(shí),定時(shí)器可以計(jì)數(shù)374×4=1496個(gè)。對(duì)于
    發(fā)表于 03-05 07:00

    電機(jī)控制基礎(chǔ)——定時(shí)器基礎(chǔ)知識(shí)與PWM輸出原理

    單片機(jī)開(kāi)發(fā)中,電機(jī)控制定時(shí)器有著密不可分的關(guān)系,無(wú)論是直流電機(jī),步進(jìn)電機(jī)還是舵機(jī),都會(huì)用到定時(shí)器
    發(fā)表于 11-30 14:21 ?38次下載
    <b class='flag-5'>電機(jī)</b><b class='flag-5'>控制</b>基礎(chǔ)——<b class='flag-5'>定時(shí)器</b>基礎(chǔ)知識(shí)與PWM輸出原理

    STM32F103-定時(shí)器編碼器模式和高級(jí)定時(shí)器輸出互補(bǔ)的PWM信號(hào)

    STM32F103-定時(shí)器編碼器模式和高級(jí)定時(shí)器輸出互補(bǔ)的PWM信號(hào)剛使用STM32時(shí)使用輸入捕獲中斷的方式計(jì)算
    發(fā)表于 01-14 12:53 ?11次下載
    STM32F103-<b class='flag-5'>定時(shí)器</b><b class='flag-5'>編碼器</b><b class='flag-5'>模式</b>和高級(jí)<b class='flag-5'>定時(shí)器</b>輸出互補(bǔ)的PWM信號(hào)

    STM32F407定時(shí)器編碼器模式簡(jiǎn)介

    STM32F407定時(shí)器編碼器模式
    發(fā)表于 03-31 17:14 ?8718次閱讀
    STM32F407<b class='flag-5'>定時(shí)器</b><b class='flag-5'>編碼器</b><b class='flag-5'>模式</b>簡(jiǎn)介

    詳解stm32定時(shí)器編碼器模式

    增量式編碼器在實(shí)際應(yīng)用中還是很常見(jiàn)。stm32的定時(shí)器帶的也有編碼器模式。所用的編碼器是有ABZ三相,其中ab相是用來(lái)計(jì)數(shù),z相輸出零點(diǎn)信號(hào)
    的頭像 發(fā)表于 01-19 09:14 ?9263次閱讀
    詳解stm32<b class='flag-5'>定時(shí)器</b>的<b class='flag-5'>編碼器</b><b class='flag-5'>模式</b>

    永磁同步電機(jī)FOC控制之STM32定時(shí)器關(guān)于編碼器模式的應(yīng)用

    最近開(kāi)始研究和學(xué)習(xí)關(guān)于永磁同步電機(jī)和BLDC電機(jī)的FOC控制,但是目前在應(yīng)用圈子上看來(lái),大多的都是使用的ST的電機(jī)庫(kù),這就讓我很不 爽,我覺(jué)得如此基礎(chǔ)以及重要的算法不應(yīng)該拿來(lái)就用,因
    發(fā)表于 03-15 11:33 ?1次下載
    永磁同步<b class='flag-5'>電機(jī)</b>FOC<b class='flag-5'>控制</b>之STM32<b class='flag-5'>定時(shí)器</b>關(guān)于<b class='flag-5'>編碼器</b><b class='flag-5'>模式</b>的應(yīng)用

    STM32控制編碼器電機(jī)實(shí)現(xiàn)速度與位置閉環(huán)控制

    ,作為T(mén)B6612的輸入,控制電機(jī)進(jìn)行調(diào)速; 定時(shí)器2(TIM2):讀取編碼器的波形; 定時(shí)器3
    發(fā)表于 05-06 09:26 ?4次下載
    STM32<b class='flag-5'>控制</b><b class='flag-5'>編碼器</b><b class='flag-5'>電機(jī)</b>實(shí)現(xiàn)速度與位置閉環(huán)<b class='flag-5'>控制</b>

    STM32CubeMx定時(shí)器編碼器模式基本使用方法

    增量式編碼器在實(shí)際應(yīng)用中還是很常見(jiàn)。stm32的定時(shí)器帶的也有編碼器模式。所用的編碼器是有ABZ三相,其中ab相是用來(lái)計(jì)數(shù),z相輸出零點(diǎn)信號(hào)
    發(fā)表于 06-01 14:36 ?5795次閱讀
    STM32CubeMx<b class='flag-5'>定時(shí)器</b><b class='flag-5'>編碼器</b><b class='flag-5'>模式</b>基本使用方法