導航:首頁 > 操作系統 > stm32單片機控制步進電機程序

stm32單片機控制步進電機程序

發布時間:2022-10-30 07:04:52

⑴ stm32f103c8t6單片機控制四項步進電機要一個c程序

對步進電機控制精度要求高不高?也就是一步走多少度? 如果不高!用uln2003或者L298N都可以!如果高的話,可以用專用驅動器,這種驅動器控制簡單!兩個介面一個輸入頻率信號控制轉速,一個輸入電平,來控制轉動方向!控制起來很簡單!顆根據功率來選,便宜的功率不大的比如像3D列印機上的步進電機驅動十幾到幾十都可以!功率大一點的,價格貴一點!

⑵ STM32控制步進電機求教

STM32單片機怎麼產生脈沖信號控制步進電動機: #include "stepmotor.h" #include u32 PUL_CNT; // TIM3脈沖計數 vu32 step_done; vu32 run_state; #define run_state_stop 0 #define run_state_acc 1 #define run_state_run

⑶ stm32怎麼用pwm控制步進電機,我知道控制步進電機要有ena、dir、plu三個管腳,但具體怎麼控制呢

ENA 是開啟 當ENA 為高電平時,此時的PLU 輸入的信號 才會有效,,DIR 為方向 ,0 1 分別為正,反轉,PLU 就是你輸出的脈沖信號 ,即PWM波,,

寫程序時,你定義以上三個變數,其中PLU 輸入一個脈沖,就可以了,,當然脈沖頻率要看你具體的電機 ,,有了脈沖,給驅動器就能控制電機轉動,當然如果沒有驅動器,你可以做一個,用2804 等晶元,,做一個也挺簡單,沒晶元,可以找H橋電路,沒有H橋,自己用三極體 搭一下,也可以。

⑷ 單片機控制步進電動機的運動的原理及單片機程序

51單片步進電機控制原理與控制設計程序
51單片步進電機是數字控制電機,它將脈沖信號轉變成角位移,即給一個脈沖信號,步進電機就轉動一個角度,因此非常適合於單片機控制。步進電機可分為反應式步進電機(簡稱vr)、永磁式步進電機(簡稱pm)和混合式步進電機(簡稱hb)。
51單片步進電機區別於其他控制電機的最大特點是,它是通過輸入脈沖信號來進行控制的,即電機的總轉動角度由輸入脈沖數決定,而電機的轉速由脈沖信號頻率決定。
51單片步進電機的驅動電路根據控制信號工作,控制信號由單片機產生。其基本原理作用如下:
(1)控制換相順序
通電換相這一過程稱為脈沖分配。例如:三相步進電機的三拍工作方式,其各相通電順序為a-b-c-d,通電控制脈沖必須嚴格按照這一順序分別控制a,b,c,d相的通斷。
(2)控制步51單片進電機的轉向
如果給定工作方式正序換相通電,步進電機正轉,如果按反序通電換相,則電機就反轉。
(3)控制51單片步進電機的速度
如果給步進電機發一個控制脈沖,它就轉一步,再發一個脈沖,它會再轉一步。兩個脈沖的間隔越短,步進電機就轉得越快。調整單片機發出的脈沖頻率,就可以對步進電機進行調速。步進電機是機電控制中一種常用的執行機構,它的用途是將電脈沖轉化為角位移,通俗地說:當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(及步進角)。通過控制脈沖個數即可以控制角位移量,從而達到准確定位的目的;同時通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。

⑸ 單片機控制步進電機程序

假設P0口低4位接步進電機4個繞組,高電平繞組通電,程序如下:
whille(1)
{P0=1;delayms(5);
P0=2;delayms(5);
P0=4;delayms(5);
P0=8;delayms(5);}
反轉 的話, 就按 8 4 2 1 順序輸出。

⑹ STM32F10驅動A4988步進電機驅動模塊程序

本人沒用過A4988,但你給出的數據有明顯錯誤:
1、VBB(電機電源):最小8V最大35V,你用(VMOT接+5V)5V;(A4988資料上沒VMOT這一介面)。
2、ENABLE(使能)埠接+A4988才能工作,你給它0V即是叫它休息不必工作。
以上

⑺ STM32單片機怎麼產生脈沖信號控制步進電動機

STM32單片機怎麼產生脈沖信號控制步進電動機:
#include "stepmotor.h"
#include
u32 PUL_CNT; // TIM3脈沖計數
vu32 step_done;
vu32 run_state;
#define run_state_stop 0
#define run_state_acc 1
#define run_state_run 2
#define run_state_dec 3
void STEPMOTOR_CTRL_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIO時鍾使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定時器3時鍾使能
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //定時器2時鍾使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7為TIM3通道2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推免輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO口響應速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA6為DIR控制輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推免輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO口響應速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
//TIM3_Configuration
TIM_TimeBaseStructure.TIM_Period = 23999; //自動重裝載寄存器
TIM_TimeBaseStructure.TIM_Prescaler = 2; //預分頻器,t=(23999+1)*(2+1)/72M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器向上計數模式
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鍾分頻因子
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //每次溢出都產生事件更新
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //寫TIM3各寄存器參數
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //中斷標志位清零
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允許捕獲/比較3中斷
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM3_CCMR1[14:12]=111 在向上計數時,一旦TIMx_CNT
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸入/捕獲2輸出允許
TIM_OCInitStructure.TIM_Pulse = 40; //確定占空比,這個值決定了有效電平的時間。
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性,低電平有效
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //配置定時器輸出模式,比較參數等
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載寄存器
//TIM2_Configuration
TIM_DeInit(TIM2); //TIM2重新配置為預設值,默認狀態

TIM_TimeBaseStructure.TIM_Period = 359; //自動重裝載寄存器
TIM_TimeBaseStructure.TIM_Prescaler = 199; //時鍾預分頻器
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器向上計數模式
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鍾分頻因子
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //配置TIM2寄存器各參數

TIM_ClearFlag(TIM2,TIM_FLAG_Update); //中斷標志位清零
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允許捕獲/比較2中斷
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn ; //選擇定時器TIM3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //選擇搶先式優先順序(與中斷嵌套級別有關)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //選擇子優先順序(同搶先式優先順序的響應順序)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //選擇使能中斷源
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ; //選擇定時器TIM2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //選擇搶先式優先順序(與中斷嵌套級別有關)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //選擇子優先順序(同搶先式優先順序的響應順序)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //選擇使能中斷源
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_Configuration(u32 period)
{
TIM3->ARR = period-1;
TIM3->CCR2 = period >> 2;
//TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
//TIM_TimeBaseStructure.TIM_Period = period-1; //自動重裝載寄存器
//TIM_TimeBaseStructure.TIM_Prescaler = 29; //預分頻器,f=72M/[(period+1)*(29+1)], ft = 2400000
//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器向上計數模式
//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鍾分頻因子
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //每次溢出都產生事件更新
//TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //寫TIM3各寄存器參數
//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM3_CCMR1[14:12]=111 在向上計數時,一旦TIMx_CNT
//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸入/捕獲2輸出允許
//TIM_OCInitStructure.TIM_Pulse = period >> 2; //確定占空比,25%
//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性,低電平有效
//TIM_OC2Init(TIM3, &TIM_OCInitStructure); //配置定時器輸出模式,比較參數等
}
//void MOTOR_RUN(u32 acc, u32 dec, u32 topspeed, u32 dis)
//步進電機運行參數
//acc -- 加速度,單位: round/min/s
//dec -- 減速度,單位: round/min/s
//topspeed -- 最高速度,單位: round/min
//dis -- 總角位移,單位: round/10000
void MOTOR_RUN(u32 acc, u32 dec, u32 topspeed, u32 dis)
{
u32 t_acc,t_dec,step_all,step_acc,step_dec,step_run;
u32 i,tim_cnt,tim_rest,tim_cnt_temp;

step_all = (float)dis * (N_MOTOR * 0.0001);
t_acc = topspeed * 1000 / acc; //unit: ms
t_dec = topspeed * 1000 / dec; //unit: ms
if(topspeed * (t_acc + t_dec) / 12 > dis) //達不到最高速度 // topspeed/60/1000 * (t_acc + t_dec) / 2 > dis / 10000
{
topspeed = sqrt(dis * acc * dec * 12 / (acc + dec) / 1000);
t_acc = topspeed * 1000 / acc; //unit: ms
t_dec = topspeed * 1000 / dec; //unit: ms
}
step_acc = N_MOTOR * ((float)topspeed*topspeed/(acc*120));
step_dec = N_MOTOR * ((float)topspeed*topspeed/(dec*120));
if(step_all > step_acc + step_dec)
step_run = step_all - step_acc - step_dec;
else
step_run = 0;
//tim_cnt = 5.2363 * ft / (sqrt(acc*N_MOTOR/2)); //(ft * sqrt(60)*0.676) / sqrt(acc*N_MOTOR/2);
tim_cnt = 7.7460 * ft / (sqrt(acc*N_MOTOR/2));
tim_rest = 0;
i = 0;
TIM3_Configuration(tim_cnt);
run_state = run_state_acc;
TIM_Cmd(TIM3,ENABLE);
step_done = 0;
while(step_done==0);
while(i
{
i++;
//tim_cnt_temp = tim_cnt;
//tim_cnt = tim_cnt - (2*tim_cnt+tim_rest) / (4*i+1);
//tim_rest = (2*tim_cnt_temp+tim_rest) % (4*i+1);
tim_cnt_temp = tim_cnt / ( sqrt((float)(i+1)) + sqrt((float)(i)) );
TIM3_Configuration(tim_cnt_temp);
step_done = 0;
while(step_done==0);
}

if(step_run > 0)
{
run_state = run_state_run;
tim_cnt = ft * 60 / (N_MOTOR*topspeed);
i = 0;
TIM3_Configuration(tim_cnt);
while(i
{
step_done = 0;
while(step_done==0);
i++;
}
}
run_state = run_state_dec;
tim_rest = 0;
i=0;
tim_cnt = tim_cnt + (2*tim_cnt+tim_rest) / (4*(step_dec-i)-1);
while(i
{
TIM3_Configuration(tim_cnt);
step_done = 0;
while(step_done==0);
i++;
tim_cnt_temp = tim_cnt;
tim_cnt = tim_cnt + (2*tim_cnt+tim_rest) / (4*(step_dec-i)-1);
tim_rest = (2*tim_cnt_temp+tim_rest) % (4*(step_dec-i)-1);
}
run_state = run_state_stop;
TIM_Cmd(TIM3,DISABLE);
}
void TIM2_IRQHandler(void)
{

}
void TIM3_IRQHandler(void)
{
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
step_done = 1;
//PUL_CNT++;
}
文件:stepmotor.h 聲明步進電機控制頭文件
#define N_MOTOR 10000 //步進電機細分
#define ft 24000000
void STEPMOTOR_CTRL_INIT(void);
void MOTOR_RUN(u32 acc, u32 dec, u32 topspeed, u32 dis);

文件:main.c 主函數,設置加速度,減速度,最大速度和步數的參數值
#include "main.h"
#define LED_SET() GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define LED_RST() GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define SET_DIR_CW() GPIO_SetBits(GPIOA,GPIO_Pin_6)
#define SET_DIR_CCW() GPIO_ResetBits(GPIOA,GPIO_Pin_6)
void NVIC_Configuration(void);
void LED_init(void);
void soft_delayms(u16 t);
int main(void)
{
SystemInit();
STEPMOTOR_CTRL_INIT();
soft_delayms(1000);

while(1)
{
SET_DIR_CW();
MOTOR_RUN(600,600,1000,500000);
soft_delayms(1000);

SET_DIR_CCW();
MOTOR_RUN(600,600,1000,500000);
soft_delayms(1000);
}
return 0;
}
void NVIC_Configuration(void)
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); //將中斷矢量放到Flash的0地址
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //設置優先順序配置的模式,詳情請閱讀原材料中的文章
}
void LED_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void soft_delayms(u16 t)
{
u16 tt;
while(t--)
{
tt = 10000;
while(tt--);
}
}

#ifndef _MAIN_H
#define _MAIN_H
#include "stm32f10x.h"
#include "stepmotor.h"

#endif

⑻ stm32怎麼驅動步進電機

需要一個步進電機驅動器,最簡單的驅動就是自己寫延時函數,定時翻轉IO口的電平;也可以用定時器的PWM模式輸出PWM,打開GPIO的復用,配置定時器到PWM模式就可以,每個定時器有4路PWM,每一路對應一個IO口,也可以重映射;復雜的加減速,就需要步進電機驅動演算法,可以用SPTA演算法,曲線趨近於S型。

⑼ stm32單片機控制步進電機要用什麼步進電機驅動器,步進電機驅動器不同單片機寫的程序也不同嘛

你控制不機電機沒要進行電機驅動器是有不同單片組成

閱讀全文

與stm32單片機控制步進電機程序相關的資料

熱點內容
如何批量快速壓縮視頻 瀏覽:432
我的世界如何加入ice伺服器 瀏覽:873
兄弟cnc編程說明書 瀏覽:204
php閃電入門教程學習 瀏覽:152
金岳霖邏輯pdf 瀏覽:938
linuxtomcat線程 瀏覽:77
pboc長度加數據加密 瀏覽:187
英雄聯盟國際服手游怎麼下安卓 瀏覽:297
程序員的思路 瀏覽:234
只能用命令獲得的四種方塊 瀏覽:358
怎麼用命令方塊防止開創造 瀏覽:807
掃描版的pdf 瀏覽:790
編程貓怎樣做3d游戲 瀏覽:207
怎麼查找雲伺服器上的ftp 瀏覽:156
我的世界伺服器如何注冊賬號 瀏覽:934
統計英文字元python 瀏覽:423
linux信息安全 瀏覽:908
壓縮機接線柱爆 瀏覽:999
程序員自主創業 瀏覽:584
匯編程序員待遇 瀏覽:359