二維碼
微世推網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 快聞頭條 » 本地資訊 » 正文

stm32編碼器接口模式,371電機(jī)方向與速度檢測

放大字體  縮小字體 發(fā)布日期:2018-04-02 21:28:25    作者:微世推-實(shí)習(xí)小海    瀏覽次數(shù):248
導(dǎo)讀

編碼器是什么玩意呢,它可是一個好玩的東西,做小車測速必不可少的玩意,下面,我將從編碼器的原理講起,一直到用stm32的編碼器接口模式,測出電機(jī)轉(zhuǎn)速與方向。1.編碼器圖1 編碼器示意圖圖1為編碼器的示意圖,中間是

編碼器是什么玩意呢,它可是一個好玩的東西,做小車測速必不可少的玩意,下面,我將從編碼器的原理講起,一直到用stm32的編碼器接口模式,測出電機(jī)轉(zhuǎn)速與方向。

1.編碼器

圖1 編碼器示意圖    圖1為編碼器的示意圖,中間是一個帶光柵的碼盤,光通過光柵,接收管接收到高電平,沒通過,接收到低電平。電機(jī)旋轉(zhuǎn)一圈,碼盤上有多少光柵,接受管就會接收多少個高電平。371電機(jī)中的碼盤就是這樣的,他是334線碼盤,具有較高的測速精度,也就是電機(jī)轉(zhuǎn)一圈輸出334個脈沖,芯片上已集成了脈沖整形觸發(fā)電路,輸出的是矩形波,直接接單片機(jī)IO就OK。     
   增量式旋轉(zhuǎn)編碼器通過內(nèi)部兩個光敏接受管轉(zhuǎn)化其角度碼盤的時序和相位關(guān)系,得到其角度碼盤角度位移量增加(正方向)或減少(負(fù)方向)。下圖為編碼器的原理圖:

圖2 增量式旋轉(zhuǎn)編碼器

A,B兩點(diǎn)對應(yīng)兩個光敏接受管,A,B兩點(diǎn)間距為 S2 ,碼盤的光柵間距分別為S0和S1。S0+S1的距離是S2的四倍。這樣保證了A,B波形相位相差90度。旋轉(zhuǎn)的反向不同,鋸齒波A,B先到達(dá)高電平的順序就會不同,如上圖左側(cè)所示,順序的不同,就可以得到旋轉(zhuǎn)的方向。

2.stm32編碼器接口模式(寄存器)
     stm32的編碼器接口模式在STM32中文參考手冊中有詳細(xì)的說明,在手冊273頁,14.3.12節(jié)。程序是完全按照 下圖方式,設(shè)置寄存器的。
     請到本文尾下載STM32中文參考手冊
      圖3       從圖3中可以看出,TI1波形先于TI2波形90°時,每遇到一個邊沿變化是,計數(shù)器加1(可以通過寄存器設(shè)置加減),可以看出一個光柵,被計數(shù)了4次。TI1波形后于TI2波形90°時 ,每遇到一次邊沿變化,計數(shù)器減1。//TIM2_Encoder_Init,Tim2_CH1(PA0);Tim2_CH2(PA1)
//arr:自動重裝值 0xFFFF
//psc:時鐘預(yù)分頻數(shù)     ,不分頻
void TIM2_Encoder_Init(u16 arr,u16 psc)
{
    RCC- APB1ENR|=1 0;      //TIM2時鐘使能
     RCC- APB2ENR|=1 2;      //使能PORTA時鐘
     
    GPIOA- CRL =0xFFFFFF00;   //PA0、PA1 清除之前設(shè)置
    GPIOA- CRL|=0x00000044;   //PA0、PA1 浮空輸入
         
    TIM2- ARR=arr;         //設(shè)定計數(shù)器自動重裝值
    TIM2- PSC=psc;         //預(yù)分頻器
     TIM2- CCMR1 |= 1 0;        //輸入模式,IC1FP1映射到TI1上
     TIM2- CCMR1 |= 1 8;        //輸入模式,IC2FP2映射到TI2上
     TIM2- CCER |= 0 1;             //IC1不反向
     TIM2- CCER |= 0 5;       //IC2不反向
     TIM2- SMCR |= 3 0;             //所用輸入均在上升沿或下降沿有效
     TIM2- CR1 |= 1 0;             //使能計數(shù)器
}復(fù)制代碼3 硬件

用到的模塊有STM32核心板、L298電機(jī)驅(qū)動、371帶編碼器電機(jī)(1:34)。這里主要介紹一下電機(jī),1:34指的是電機(jī)軸轉(zhuǎn)動34圈,電機(jī)輸出1圈。1:X,X值越小,電機(jī)的輸出轉(zhuǎn)速也就越快,扭矩也就越?。环粗?,X值越大,電機(jī)的輸出轉(zhuǎn)速越慢,扭矩也越大。

圖4 電機(jī)實(shí)物圖

左邊兩根黃線是電機(jī)兩極。綠線和白線是脈沖輸出線,分別接編碼器的接收管A、B,用一根可以測得速度,兩根同時用可測出電機(jī)速度與轉(zhuǎn)向。紅線和黑線是編碼器電源接線,紅正黑負(fù),電壓3.3V-5V,不不可接反。

4 控制代碼

工作指示燈、電機(jī)方向與速度控制代碼。

//LED IO 初始化 端口PD.2 運(yùn)行指示燈
void LED_Init(void)
{             
     RCC- APB2ENR|=1 5;     //使能PORTD時鐘       
     GPIOD- CRL =0xFFFFF0FF;
     GPIOD- CRL|=0x00000300; //PD.2推挽輸出
     GPIOD- ODR|=1 2;     //PD.2輸出高
}
//電機(jī)旋轉(zhuǎn)方向控制信號端口初始化
//PC1~0推挽輸出,輸出高
void M_Init(void)
{
     RCC- APB2ENR|=1 4;     //使能PORTC時鐘
     GPIOC- CRL =0xFFFFFF00;
     GPIOC- CRL|=0x00000033; //PC1~0推挽輸出
     GPIOC- ODR|=0XF 0;          //PC1~0輸出高電平
}
//定時器TIM3,PWM輸出初始化,CH1(PA6)
//arr:自動重裝值
//psc:時鐘預(yù)分頻數(shù)
//設(shè)置自動重裝值為900,那么PWM頻率=72000/900=8Khz
////見STM32參考手冊,14.3.9PWM模式。
void TIM3_PWM_Init(u16 arr,u16 psc) //arr設(shè)定計數(shù)器自動重裝值   
                         //psc預(yù)分頻器不分頻,psc=0
{
     RCC- APB1ENR|=1 1;      //TIM3時鐘使能   
             
     GPIOA- CRL =0xF0FFFFFF;//PA6輸出
     GPIOA- CRL|=0x0B000000;//復(fù)用功能輸出       
     GPIOA- ODR|=1 6;//PA6上拉     
     TIM3- ARR=arr;//設(shè)定計數(shù)器自動重裝值
     TIM3- PSC=psc;//預(yù)分頻器不分頻
     
     TIM3- CCMR1|=6 4; //CH1 PWM1模式     高電平有效       
     TIM3- CCMR1|=1 3; //CH1預(yù)裝載使能
     TIM3- CCER|=1 0;   //OC1 輸出使能   
     TIM3- CR1=0x0080;   //ARPE使能
     TIM3- CR1|=0x01;    //使能定時器3
}
//電機(jī)方向與速度控制,速度調(diào)節(jié)范圍為-100~+100
//大于0時,正轉(zhuǎn),小于0時,反轉(zhuǎn)
// 占空比低于0.4時電機(jī)不轉(zhuǎn)
//(占空比是指高電平在一個周期之內(nèi)所占的時間比率)
//TIM3- CCR1的設(shè)定范圍為0~900(因?yàn)閍rr=900)
//見STM32參考手冊,14.3.9PWM模式。
void Motor_Speed_Control(s16 motorSpeed)       
{
    s16 speed = 0 ;     
     
    if(motorSpeed 100) speed = 900;
         else if (motorSpeed -100) speed = -900;
                 else speed = motorSpeed;
     if(speed == 0)
     {
            M_1 = 0;
            M_2 = 0;
     }
         else if(speed 0)
            {
                 M_1 = 0;
                 M_2 = 1;
                 TIM3- CCR1 = speed * 5 + 400;
            }
                 else
                 {
                     M_1 = 1;
                     M_2 = 0;
                     TIM3- CCR1 = -speed * 5 +400;
                 }
}
復(fù)制代碼

電機(jī)速度與方向檢測代碼

//TIM2_Encoder_Init,Tim2_CH1(PA0);Tim2_CH2(PA1)
//arr:自動重裝值 0xFFFF
//psc:時鐘預(yù)分頻數(shù)     ,不分頻
//見STM32中文手冊 14.3.12編碼器接口模式
void TIM2_Encoder_Init(u16 arr,u16 psc)
{
    RCC- APB1ENR|=1 0;      //TIM2時鐘使能
     RCC- APB2ENR|=1 2;      //使能PORTA時鐘
     
    GPIOA- CRL =0xFFFFFF00;   //PA0、PA1 清除之前設(shè)置
    GPIOA- CRL|=0x00000044;   //PA0、PA1 浮空輸入
         
    TIM2- ARR=arr;         //設(shè)定計數(shù)器自動重裝值
    TIM2- PSC=psc;         //預(yù)分頻器
     TIM2- CCMR1 |= 1 0;        //輸入模式,IC1FP1映射到TI1上
     TIM2- CCMR1 |= 1 8;        //輸入模式,IC2FP2映射到TI2上
     TIM2- CCER |= 0 1;             //IC1不反向
     TIM2- CCER |= 0 5;       //IC2不反向
    TIM2- SMCR |= 3 0;             //所用輸入均在上升沿或下降沿有效
     TIM2- CR1 |= 1 0;             //使能計數(shù)器
}
//計數(shù)寄存器賦值
void TIM2_Encoder_Write(int data)
{
    TIM2- CNT = data;
}
//讀計數(shù)個數(shù)
int TIM2_Encoder_Read(void)
{
    TIM2_Encoder_Write(0);     //計數(shù)器清0
     delay_ms(10);        //檢測時間,可調(diào)節(jié)
    return (int)((s16)(TIM2- CNT));       //數(shù)據(jù)類型轉(zhuǎn)換
                   //記錄邊沿變化次數(shù)(一個柵格被記錄4次)
}復(fù)制代碼

這里我們只顯示邊沿變化次數(shù),沒有具體的算出速度。
主函數(shù)

int main(void)
{
//     motorSpeed的范圍為-100 ~ +100;
     s16 motorSpeed = 100;
     Stm32_Clock_Init(9); //系統(tǒng)時鐘設(shè)置
     delay_init(72);          //延時初始化
     uart_init(72,9600); //串口1初始化
     LED_Init();                  //初始化與LED連接的硬件接口
     M_Init();                   ////初始化電機(jī)運(yùn)行方向控制端口
     TIM3_PWM_Init(900,0);        //不分頻。PWM頻率=72000/900=8Khz
     TIM2_Encoder_Init(0xffff, 0); //計數(shù)器自動重裝值為最大
     while(1)
    {
            LED =! LED;
         Motor_Speed_Control(motorSpeed);
            printf("編碼器值:%d\n ",TIM2_Encoder_Read());
    }           
}復(fù)制代碼5 估算驗(yàn)證
       這里我們只是大概的估算驗(yàn)證測量值是否正確,不具有完全正確性。
      我們設(shè)置motorSpeed = 100 ,得到測量值如下圖:

圖5 motorSpeed = 100

因?yàn)檎`差是不可避免的,所以看到每次檢測的值都是不一樣的。我們?nèi)?62,因?yàn)橐粋€光柵被記錄了4次,所以在10ms內(nèi)一共檢測到了462/4=115.5,那么得到11.55個/ms,每ms內(nèi)檢測到11.55個光柵。

   通過碼表,記錄電機(jī)輸出50圈,用時50.2s,那么這時應(yīng)該檢測到的光柵個數(shù)為50*34(電機(jī)轉(zhuǎn)34圈,輸出1圈)*334(每圈有334個光柵)=567800,除以時間,得到估算值11.31個/ms。可以看出估算值與測量值是相近的,認(rèn)為測量是準(zhǔn)確的。
     設(shè)置motorSpeed = -50 ,得到測量值如下圖 :
 
(文/微世推-實(shí)習(xí)小海)
免責(zé)聲明
本文僅代表發(fā)布者:微世推-實(shí)習(xí)小海個人觀點(diǎn),本站未對其內(nèi)容進(jìn)行核實(shí),請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
 

Copyright?2015-2025 粵公網(wǎng)安備 44030702000869號

粵ICP備16078936號

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

24在線QQ: 770665880

客服電話: 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號: weishitui

韓瑞 小英 張澤

工作時間:

周一至周五: 08:00 - 24:00

反饋

用戶
反饋