STM32控制启动步进电机
生活随笔
收集整理的這篇文章主要介紹了
STM32控制启动步进电机
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
概述
正在做的項目需要用STM32控制步進電機,本篇主要講解利用STM32定時器外設輸出脈沖來控制步進電機轉動。
STM32定時器
使用STM32芯片類型:STM32c8t6。
使用外設接口:選用TIM4的CH1通道,對應輸出脈沖IO口為PB6。
步進驅動器介紹
(這里以兩相步進驅動器為例,詳細見說明書)
- 接口
步進驅動器可分為兩部分:環(huán)形分配器、功率放大器。
環(huán)形分配器:接收3種信號分別為:脈沖信號(PUL),方向信號(DIR),脫機信號(ENA)。
脈沖信號:環(huán)形分配器對脈沖信號進行分配,去控制功率放大器相應的晶體管,使步進電機的線圈得電。所以,步進電機要運轉就必須有脈沖輸入,所以需要一個驅動器來給步進電機的各項繞組依次通電。
方向信號:控制AB通電的相序,A-B順時針,B-A逆時針
脫機信號:步進電機停止時,AB線圈有一相得電,得電的功能使轉子鎖住,使轉子不能動,需要收去撥動轉子的時候,需要給脫機信號,使AB相繞組完全斷電,轉子處于自由轉動狀態(tài)。(也就是說控制電機停止除了不給脈沖之外,還可以控制脫機信號來鎖死電機,此處用不著脫機信號)
- 細分
為了提高步進電動機控制的精度,現(xiàn)在的步進驅動器都有細分的功能,所謂細分,就是通過驅動器中電路的方法把步距角減小。比如把步進驅動器設置成5細分,假設原來步距角1.8°那么設成5細分后,步距角就是0.36°。也就是說原來一步可以走完的,設置成細分后需要走5步。一般步進電動機的細分表在驅動器上可以直接看到。(設置合適細分能夠避免電機轉動時震動過大,但過高的細分數(shù)會導致電機輸出力矩減小)
- 驅動電源:
需要9-42V直流電源,需要使用變壓器將220V交流電轉為24V直流電
定時器頻率與步進電機的關系
-
接線
將驅動器PUL+端接入STM32輸出脈沖的IO口(PB6),PUL-端接地
將驅動器DIR+端接入STM32的任意一個閑置IO口(這里選PB5),DIR-端接地
驅動器ENA±端不接
A+、A-、B+、B-接入步進電機
電源接到變壓器 -
頻率與速度的關系
確定輸出脈沖頻率與電機轉速的關系,對于兩相步進電機而言:
轉速 = 脈沖頻率 * 60 /((360/T)*x) T是步進電機步距角(1.8°),x是驅動器細分倍數(shù)(16) 脈沖頻率= 時鐘頻率(72Mhz)/ ((arr+1)*(psc+1))根據(jù)以上公式,可以得到:
Speed = 15r/min時,若確定arr為199,則psc為449
其他速度可根據(jù)需要自行設定。
代碼
編寫流程:TIM4配置 -> DIR對應IO口配置 -> main調用初始化函數(shù)并設置占空比
//TIM4配置 void TIM4_PWM_Init(u16 arr,u16 psc) //初始化arr=200,psc = 450得到電機速度為15r/min { //初始化結構體NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//使能時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //設置該引腳為復用輸出功能,輸出TIM4 CH1的PWM脈沖波形 GPIOB.6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM4_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//計數(shù)模式TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //定時中斷配置TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); /NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //初始化TIM4 Channel1 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_Cmd(TIM4,ENABLE); //使能定時器 } /*PB5電機方向引腳配置*/ void DIR_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } int main() {DIR_Init();TIM4_PWM_Init(200,450);TIM_SetCompare1(TIM4,200/2); //設置占空比為50%(=arr/2),不設置的話電機啟動不了while(){;} }對應工程文件:
CSDN:STM32c8t6啟動步進電機
GitHub: STM32-drives-step-motor
總結
以上是生活随笔為你收集整理的STM32控制启动步进电机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通达信波段王指标公式主图_通达信波段操盘
- 下一篇: Java学习笔记——Character类