標(biāo)題:
STM32步進(jìn)電機(jī)編碼器讀取源碼
[打印本頁(yè)]
作者:
Leo.Lee
時(shí)間:
2018-11-9 15:19
標(biāo)題:
STM32步進(jìn)電機(jī)編碼器讀取源碼
STM32F10X 步進(jìn)電機(jī)編碼器 讀取 Hal固件庫(kù)。
【1】例程簡(jiǎn)介
使用定時(shí)器功能輸出PWM信號(hào)到步進(jìn)電機(jī)驅(qū)動(dòng)器,使其驅(qū)動(dòng)步進(jìn)電機(jī)轉(zhuǎn)動(dòng)。
編碼器用于電機(jī)測(cè)速。在電機(jī)轉(zhuǎn)動(dòng)一圈時(shí)編碼器可以輸出固定的脈沖數(shù),通過讀取編碼器
脈沖可以獲取當(dāng)前電機(jī)轉(zhuǎn)動(dòng)狀態(tài)。
一般處理編碼器脈沖有兩種方法:
1. T法:計(jì)算一定量的脈沖數(shù)所用的時(shí)間
2. M法:計(jì)算一段固定時(shí)間內(nèi)所捕獲的脈沖數(shù)。
【2】跳線帽情況
編碼器 A相 --> PC6
B相 --> PC7
步進(jìn)電機(jī)驅(qū)動(dòng)器 DIR- --> PB13
ENA- --> PB14
PUL- --> PA8
DIR+ --> +5V
ENA+ --> +5V
PUL+ --> +5V
【3】操作及現(xiàn)象
根據(jù)引腳定義方法連接開發(fā)板和步進(jìn)電機(jī)驅(qū)動(dòng)器,另外步進(jìn)電機(jī)驅(qū)動(dòng)器和
步進(jìn)電機(jī)的連接自行根據(jù)電機(jī)和驅(qū)動(dòng)器標(biāo)識(shí)連接,步進(jìn)電機(jī)驅(qū)動(dòng)器需要一個(gè)24V的直流
電源供電,編碼器是開漏輸出.所以需要接上拉電阻才能正常讀取數(shù)據(jù)。接線時(shí)注意開發(fā)板與步進(jìn)電機(jī)
驅(qū)動(dòng)板“共地”連接,編碼器與開發(fā)板"共地"連接。使用開發(fā)板配套的MINI USB線連接到開發(fā)板標(biāo)示
“調(diào)試串口”字樣的MIMI USB接口為開發(fā)板提供電源。下載完程序之后,開發(fā)板持續(xù)PWM脈沖給步進(jìn)
電機(jī)驅(qū)動(dòng)器,電機(jī)持續(xù)轉(zhuǎn)動(dòng),同時(shí)在串口發(fā)送當(dāng)前編碼器捕獲值,和速度值.
單片機(jī)源程序如下:
/**
******************************************************************************
* 文件名程: main.c
* 作 者: 硬石嵌入式開發(fā)團(tuán)隊(duì)
* 版 本: V1.1
* 功 能: 步進(jìn)電機(jī)編碼測(cè)速
*/
/* 包含頭文件 ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
#include "StepMotor/bsp_STEPMOTOR.h"
#include "usart/bsp_debug_usart.h"
#include "EncoderTIM/bsp_EncoderTIM.h"
#include <string.h>
/* 私有類型定義 --------------------------------------------------------------*/
/* 私有宏定義 ----------------------------------------------------------------*/
#define SAMPLING_PERIOD 20 // 采樣周期;單位20ms
#define TXDCYCLE 1000 // 數(shù)據(jù)發(fā)送周期;單位:ms
#define SAMPLING 0x01 // 采樣標(biāo)記
#define TXD 0x02 // 發(fā)送數(shù)據(jù)標(biāo)記
#define SPEED_CONSTANT ((((float)(TXDCYCLE)/SAMPLING_PERIOD))/PSPM);//脈沖數(shù)轉(zhuǎn)換為mm/s的系數(shù),1秒的脈沖數(shù)/1毫米的脈沖數(shù),這里擴(kuò)大10倍
#define abs(x) ((x)<0?(-x):(x))
#define SENDBUFF_SIZE 60 // 串口DMA發(fā)送緩沖區(qū)大小
/* 私有變量 ------------------------------------------------------------------*/
__IO uint16_t time_count=0; // 時(shí)間計(jì)數(shù),每1ms增加一(與滴答定時(shí)器頻率有關(guān))
__IO int32_t CaptureNumber=0; // 輸入捕獲數(shù)
__IO int32_t Last_CaptureNumber=0; // 上一次捕獲值
__IO static int16_t Speed = 50; // 換算為絲杠上行進(jìn)的速度,單位為:0.1mm/s所以實(shí)際速度是5mm/s
__IO uint16_t SUM_Pulse = 0;
__IO int16_t MSF = 0; // 電機(jī)反饋速度
__IO float MMPS = 0; // mm Per Seconed (mm/s)
__IO uint8_t Time_Flag = 0; // 標(biāo)記時(shí)間
uint8_t aTxBuffer[SENDBUFF_SIZE]; // 串口DMA發(fā)送緩沖區(qū)
/* 擴(kuò)展變量 ------------------------------------------------------------------*/
extern int16_t OverflowCount; //編碼器計(jì)數(shù)溢出 計(jì)數(shù)器
/* 私有函數(shù)原形 --------------------------------------------------------------*/
/* 函數(shù)體 --------------------------------------------------------------------*/
/**
* 函數(shù)功能: 系統(tǒng)時(shí)鐘配置
* 輸入?yún)?shù): 無
* 返 回 值: 無
* 說 明: 無
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍頻,得到72MHz主時(shí)鐘
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系統(tǒng)時(shí)鐘:72MHz
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB時(shí)鐘:72MHz
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1時(shí)鐘:36MHz
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2時(shí)鐘:72MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
// HAL_RCC_GetHCLKFreq()/1000 1ms中斷一次
// HAL_RCC_GetHCLKFreq()/100000 10us中斷一次
// HAL_RCC_GetHCLKFreq()/1000000 1us中斷一次
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并啟動(dòng)系統(tǒng)滴答定時(shí)器
/* 系統(tǒng)滴答定時(shí)器時(shí)鐘源 */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* 系統(tǒng)滴答定時(shí)器中斷優(yōu)先級(jí)配置 */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/**
* 函數(shù)功能: 主函數(shù).
* 輸入?yún)?shù): 無
* 返 回 值: 無
* 說 明: 無
*/
int main(void)
{
/* 復(fù)位所有外設(shè),初始化Flash接口和系統(tǒng)滴答定時(shí)器 */
HAL_Init();
/* 配置系統(tǒng)時(shí)鐘 */
SystemClock_Config();
/* 調(diào)試串口初始化 */
MX_DEBUG_USART_Init();
/* 編碼器定時(shí)器初始化并配置輸入捕獲功能 */
ENCODER_TIMx_Init();
/* 啟動(dòng)編碼器接口 */
HAL_TIM_Encoder_Start(&htimx_Encoder, TIM_CHANNEL_ALL);
/* 步進(jìn)電機(jī)定時(shí)器初始化*/
STEPMOTOR_TIMx_Init();
/* 啟動(dòng)定時(shí)器 */
HAL_TIM_Base_Start(&htimx_STEPMOTOR);
/* 啟動(dòng)比較輸出并使能中斷 */
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
STEPMOTOR_OUTPUT_ENABLE();
/* 無限循環(huán) */
while (1)
{
//采樣和控制周期為20ms
if(Time_Flag & SAMPLING)
{
//獲得編碼器的脈沖值
CaptureNumber = OverflowCount*65535 + __HAL_TIM_GET_COUNTER(&htimx_Encoder);
//M法 測(cè)速度 M法是測(cè)量單位時(shí)間內(nèi)的脈數(shù),然后換算成頻率,這里不算頻率
MSF = CaptureNumber - Last_CaptureNumber;
Last_CaptureNumber = CaptureNumber;
//對(duì)速度進(jìn)行累計(jì),得到1s內(nèi)的脈沖數(shù)
MSF = abs(MSF);
SUM_Pulse += MSF;
MMPS = MSF*SPEED_CONSTANT;//由脈沖數(shù)轉(zhuǎn)換為 mm/s, MMPS = (MSF*(TXDCYCLE/SAMPLING_PERIOD))/PSPM;
if(Speed >= MAX_SPEED)//限制最大速度
Speed = MAX_SPEED;
if(Speed <= MIN_SPEED)
Speed = MIN_SPEED;
STEPMOTOR_Motion_Ctrl(CW,Speed);
Time_Flag &= ~SAMPLING;
}
//數(shù)據(jù)發(fā)送周期為1s
if(Time_Flag & TXD)
{
sprintf(aTxBuffer,"捕獲值: %d -- 速度: %.2f mm/s\n",CaptureNumber,(float)MMPS);
sprintf(aTxBuffer+strlen((const char*)aTxBuffer),"1s內(nèi)編碼器計(jì)數(shù)值: %5d \n\0",SUM_Pulse);
HAL_UART_Transmit_DMA(&husart_debug,aTxBuffer,strlen((const char*)aTxBuffer));
SUM_Pulse = 0;
Time_Flag &= ~TXD;
}
}
}
/**
* 函數(shù)功能: 系統(tǒng)滴答定時(shí)器中斷回調(diào)函數(shù)
* 輸入?yún)?shù): 無
* 返 回 值: 無
* 說 明: 每發(fā)生一次滴答定時(shí)器中斷進(jìn)入該回調(diào)函數(shù)一次
*/
void HAL_SYSTICK_Callback(void)
{
// 每1ms自動(dòng)增一
time_count++;
if(time_count%(SAMPLING_PERIOD) == 0)// 20ms讀取一次編碼器數(shù)值
{
Time_Flag |= SAMPLING;
}
else if(time_count>=TXDCYCLE) //1s發(fā)送一次數(shù)據(jù)
{
Time_Flag |= TXD;
time_count=0;
}
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式開發(fā)團(tuán)隊(duì) *****END OF FILE****/
復(fù)制代碼
所有資料51hei提供下載:
YSF1_HAL_MOTOR-017. 步進(jìn)電機(jī)編碼器讀取.rar
(3.15 MB, 下載次數(shù): 198)
2018-11-11 01:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
esmember
時(shí)間:
2018-11-22 08:43
這個(gè)先支持一下,最近一直調(diào)試這個(gè),解決不了呢。
作者:
swap1
時(shí)間:
2018-11-26 13:37
這個(gè)先支持一下
作者:
Papertiger
時(shí)間:
2018-12-12 17:42
學(xué)習(xí)一下編碼器
作者:
LET_ME
時(shí)間:
2019-3-4 16:22
支持樓主
作者:
BATTER_LI
時(shí)間:
2019-4-8 15:49
剛需,學(xué)習(xí)一下啊
作者:
Tiramisu_L
時(shí)間:
2019-7-11 11:12
我是想找樓主要一下hal庫(kù)的教程的。我剛開始用hal庫(kù),很多不是很懂,想找個(gè)視頻教程什么的;蛘哒n件也是可以的
作者:
rick_liu
時(shí)間:
2019-12-19 17:40
感謝分享!!
作者:
rick_liu
時(shí)間:
2019-12-19 17:41
這個(gè)先支持一下
作者:
你的青春我的夢(mèng)
時(shí)間:
2020-5-13 10:54
謝謝分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1