一、涉及資源
stm32f103ZET6開發(fā)板(非指定)
MG513P3012V型號電機(帶霍爾編碼器)(非指定)
二、涉及概念
1、單片機資源要求
此種測速方法要求單片機的定時器具有編碼器模式,對于stm32f1系列,具備編碼器模式的定時器有TIM1/2/3/4/5/8,定時器使用通道1、2來實現(xiàn)編碼器功能,接線時注意把A/B相接到定時器通道1/2的引腳。
2、減速比
電機結(jié)構(gòu)
減速結(jié)構(gòu)
減速比為1:30通俗地講就是當(dāng)電機外伸軸轉(zhuǎn)1圈時實際軸轉(zhuǎn)30圈,外伸軸我們一般接上輪胎等實際作用物體,而實際軸是電機自身的轉(zhuǎn)子,霍爾編碼器的檢測對象是實際軸
3、測速原理
霍爾編碼器工作方式
霍爾編碼器是一種通過磁電轉(zhuǎn)換將輸出軸上的機械幾何位移量轉(zhuǎn)換成脈沖或數(shù)字量的傳感器?;魻柧幋a器是由霍爾碼盤和霍爾元件組成?;魻柎a盤是在一 定直徑的圓板上等分地布置有不同的磁極。電機旋轉(zhuǎn)一圈霍爾元件發(fā)出特定數(shù)目的脈沖信號。,用時間間隔內(nèi)接收的總的脈沖數(shù)目除以轉(zhuǎn)一圈發(fā)出的脈沖數(shù)目即可得到轉(zhuǎn)軸轉(zhuǎn)的圈數(shù),再除以時間間隔就能得到轉(zhuǎn)速。 為判斷轉(zhuǎn)向,一般輸出兩組存在一定相位差的方波信號。
定時器判斷電機正反轉(zhuǎn)的依據(jù)
定時器通道1、通道2接收A相和B相的脈沖信號,轉(zhuǎn)一圈A相和B相發(fā)出的脈沖數(shù)目是一樣的,但是發(fā)送有先后之分。
定時器針對正反轉(zhuǎn)的兩種計數(shù)方式
定時器在編碼器模式下有兩種計數(shù)方式,正轉(zhuǎn)時是從重載值開始向下減數(shù),反轉(zhuǎn)時是從零開始向上加數(shù)(正反是相對而言的)。例如,如果我設(shè)定定時器的重載值為0x7fff,那么當(dāng)定時器接收到10個正轉(zhuǎn)的脈沖時,計數(shù)值變?yōu)?x7ff3,當(dāng)定時器接收到的是反轉(zhuǎn)的脈沖時,定時器的計數(shù)值變?yōu)?x000A。
定時器編碼器模式1、2、3
TI1和TI2分別為定時器的通道1和通道2
編碼器模式3即為四倍頻模式,這個模式下對于A和B相發(fā)過來的一組脈沖會有四次計數(shù)(四個跳變沿),這樣就能將檢測精度提到四倍。
4、M法測速
三、編碼器與單片機的接線
注:這里以stm32f1系列的定時器4為例,若使用其他定時器進行測速需要更換對應(yīng)的引腳資源,編碼器A/B相需接到定時器的通道1和通道2
1、霍爾編碼器實物圖
接線
編碼器A相和B相接PB6和PB7引腳(無對應(yīng)要求)
四、單片機引腳和定時器的初始化
1、代碼示例
引腳選擇PB6和PB7
定時器選擇TIM4,使用編碼器模式3
/*****************************************************
*@Func: 編碼器涉及資源的初始化
******
*@para:
******
*@desc: 選擇TIM4作為此編碼器的解碼時鐘
****** 設(shè)置重裝值
****** 注意:實際使用時對轉(zhuǎn)速有限制,如果轉(zhuǎn)速太快可能發(fā)生定時器溢出的情況,就要考慮使用中斷
****** 目前對脈沖一次定時僅能計32768次,超過即無效,可以分別正反轉(zhuǎn)。
****** 定時器在編碼器模式下電機如果正轉(zhuǎn)計數(shù)器會從零開始正數(shù),如果反轉(zhuǎn)計數(shù)器會從重載值開始倒數(shù)
******************************************************/
void EncoderA_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 引腳初始化的結(jié)構(gòu)體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 定時器初始化的結(jié)構(gòu)體
TIM_ICInitTypeDef TIM_ICInitStructure; // 定時器編碼器模式初始化的結(jié)構(gòu)體
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 使能TIM4時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // PB6、PB7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空輸入
GPIO_Init(GPIOB, &GPIO_InitStructure); // 根據(jù)GPIO_InitStructure的參數(shù)初始化GPIOB0
TIM_TimeBaseStructure.TIM_Period = 0xffff; // 設(shè)定計數(shù)器自動重裝值
TIM_TimeBaseStructure.TIM_Prescaler = 0; // 預(yù)分頻器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 選擇時鐘分頻:不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); // 根據(jù)TIM_TimeBaseInitStruct的參數(shù)初始化定時器TIM4
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用編碼器模式3:CH1、CH2同時計數(shù),四分頻
//初始化TIM4輸入捕獲參數(shù)
TIM_ICStructInit(&TIM_ICInitStructure); // 把TIM_ICInitStruct 中的每一個參數(shù)按缺省值填入
TIM_ICInitStructure.TIM_ICFilter = 0x03; // IC1F=0011 配置輸入濾波器(連續(xù)采樣八次)
TIM_ICInit(TIM4, &TIM_ICInitStructure); // 根TIM_ICInitStructure參數(shù)初始化定時器TIM4編碼器模式
TIM_Cmd(TIM4, ENABLE); // 使能定時器4
}
五、讀定時器的計數(shù)值
定時器的計數(shù)值即為編碼器發(fā)出的脈沖數(shù)目*4(定時器的編碼器模式3)
/*****************************************************
*@Func: 讀取定時器計數(shù)值
******
*@para:
******
*@desc:
******************************************************/
void Read_EncoderA(void)
{
if(TIM4->CNT > 0x7fff)
{
EncoderA = TIM4->CNT - 0xffff; // 反轉(zhuǎn)
}
else
{
EncoderA = TIM4->CNT; // 正轉(zhuǎn)
}
TIM4->CNT = 0xffff;
}
六、由定時器計數(shù)值得到轉(zhuǎn)速
1、計算公式
使用M法測速,計算公式為:
轉(zhuǎn)速n = 總脈沖數(shù)/四倍頻/單圈脈沖數(shù)/減速比/時間間隔文章來源:http://www.zghlxwxcb.cn/news/detail-458448.html
2、代碼示例
電機轉(zhuǎn)一圈本款霍爾編碼器發(fā)出13個脈沖,本款電機的減速比為1:30文章來源地址http://www.zghlxwxcb.cn/news/detail-458448.html
/*****************************************************
*@Func: 獲取電機A的速度
******
*@para:
******
*@desc: 返回的是電機的轉(zhuǎn)速 n圈/s
****** 轉(zhuǎn)速n = 總脈沖數(shù)/四倍頻/單圈脈沖數(shù)/減速比/時間
******************************************************/
void Get_MotorA_Speed(void)
{
Read_EncoderA(); // 獲取編碼器產(chǎn)生的脈沖數(shù)
MotorASpeed = (float)EncoderA / 4 / PulseNum / ReRate / DecodeGapTime * 1000;
}
到了這里,關(guān)于stm32f103單片機—編碼器測速的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!