初始化:
stepper_motor_init(stepper_motor_a_ptr);
stepper_motor_init(stepper_motor_b_ptr);
定時器需要放置的函數(shù): 定時器暫用1ms,可根據(jù)應用修改
stepper_motor_timer(stepper_motor_a_ptr);
stepper_motor_timer(stepper_motor_b_ptr);
旋轉配置:
stepper_motor_mode_set(stepper_motor_a_ptr,STEPPER_MOTOR_F,512,STEPPER_MOTOR_A_SPEED); //Motor A順時針轉一圈
stepper_motor_mode_set(stepper_motor_b_ptr,STEPPER_MOTOR_R,512,STEPPER_MOTOR_B_SPEED); //Motor B逆時針轉一圈
stepper_motor_mode_set 參數(shù)說明:
1、結構體指針
2、旋轉方向
STEPPER_MOTOR_F 順時針
STEPPER_MOTOR_R 逆時針
STEPPER_MOTOR_STOP 停止
3、旋轉角度 (實際轉動角度 = angle * 5.625 / 8)
4、旋轉速度 1 最快,數(shù)值越大,速度越慢
單片機源程序如下:
- /*
- * @Descripttion:
- * @version:
- * @Author: linsuwei
- * @Date: 2020-10-27 10:39:36
- * @LastEditors: linsuwei
- * @LastEditTime: 2020-10-29 11:43:50
- */
- #include "stepper_motor.h"
- static u8 get_Offset(STEPPER_MOTOR_PTR stepmo_ptr);
- u32 a_motor_a_io[] = {
- STEPPER_MOTOR_A_IO_0,
- STEPPER_MOTOR_A_IO_1,
- STEPPER_MOTOR_A_IO_2,
- STEPPER_MOTOR_A_IO_3,
- };
- u32 a_motor_b_io[] = {
- STEPPER_MOTOR_B_IO_0,
- STEPPER_MOTOR_B_IO_1,
- STEPPER_MOTOR_B_IO_2,
- STEPPER_MOTOR_B_IO_3,
- };
- #define __IO_L 0
- #define __IO_F 1
- u8 stepper_timing_tab[] = {
- __IO_L,__IO_F,__IO_F,__IO_F, //pulse 1
- __IO_L,__IO_L,__IO_F,__IO_F, //pulse 2
- __IO_F,__IO_L,__IO_F,__IO_F, //...
- __IO_F,__IO_L,__IO_L,__IO_F,
- __IO_F,__IO_F,__IO_L,__IO_F,
- __IO_F,__IO_F,__IO_L,__IO_L,
- __IO_F,__IO_F,__IO_F,__IO_L,
- __IO_L,__IO_F,__IO_F,__IO_L,
- };
- STEPPER_MOTOR_S stepper_motor_a = {
- .mode = STEPPER_MOTOR_STOP,
- .pulse = 0,
- .speed = 1,
- .max_step = 0,
- .step = 0,
- .timing_tab_ptr = &stepper_timing_tab[0],
- .io_tab_ptr = &a_motor_a_io[0],
- };
- STEPPER_MOTOR_S stepper_motor_b = {
- .mode = STEPPER_MOTOR_STOP,
- .pulse = 0,
- .speed = 1,
- .max_step = 0,
- .step = 0,
- .timing_tab_ptr = &stepper_timing_tab[0],
- .io_tab_ptr = &a_motor_b_io[0],
- };
- STEPPER_MOTOR_PTR stepper_motor_a_ptr = &stepper_motor_a;
- STEPPER_MOTOR_PTR stepper_motor_b_ptr = &stepper_motor_b;
- static u8 get_Offset(STEPPER_MOTOR_PTR stepmo_ptr)
- {
- if(NULL == stepmo_ptr)
- return 0;
- if(STEPPER_MOTOR_F == stepmo_ptr->mode)
- return stepmo_ptr->step;
- else if(STEPPER_MOTOR_R == stepmo_ptr->mode)
- return (7 - stepmo_ptr->step);
- else
- return stepmo_ptr->step;
- }
- void stepper_motor_stop(STEPPER_MOTOR_PTR stepmo_ptr)
- {
- if(NULL == stepmo_ptr)
- return;
- for (u8 i = 0; i < 4; i++)
- {
- gpio_direction_input(stepmo_ptr->io_tab_ptr[i]);
- }
- stepmo_ptr->mode = STEPPER_MOTOR_STOP;
- }
- void stepper_motor_init(STEPPER_MOTOR_PTR stepmo_ptr)
- {
- if(NULL == stepmo_ptr)
- return;
- stepmo_ptr->mode = STEPPER_MOTOR_STOP;
- stepmo_ptr->step = 0;
- stepmo_ptr->max_step = 0;
- stepmo_ptr->pulse = 0;
- stepmo_ptr->speed = 1;
- stepmo_ptr->timing_tab_ptr = &stepper_timing_tab[0],
- stepper_motor_stop(stepmo_ptr);
- }
- //減速比 64
- // Precision = 360 /((360/5.625)*64) = 5.625/64 控制精度
- // 實際轉動角度 = (angle *8) * Precision = angle * 5.625 / 8
- void stepper_motor_mode_set(STEPPER_MOTOR_PTR stepmo_ptr, u8 mode, u16 angle ,u8 speed)
- {
- if(NULL == stepmo_ptr)
- return;
- stepmo_ptr->mode = mode;
- stepmo_ptr->speed = speed;
- stepmo_ptr->max_step = angle * 8; // 這里將精度放大 8倍,方便計算
- if(STEPPER_MOTOR_STOP == mode)
- {
- stepper_motor_stop(stepmo_ptr);
- }
- }
- void stepper_motor_timer(STEPPER_MOTOR_PTR stepmo_ptr)
- {
- static u8 cnt = 0;
- if(NULL == stepmo_ptr)
- return;
- if (STEPPER_MOTOR_STOP == stepmo_ptr->mode)
- {
- // stepper_motor_stop(stepmo_ptr);
- return;
- }
- else
- {
- if (++cnt >= stepmo_ptr->speed)
- {
- cnt = 0;
- if (stepmo_ptr->max_step > 0)
- {
- if (++stepmo_ptr->pulse > stepmo_ptr->max_step)
- {
- stepmo_ptr->pulse = 0;
- stepmo_ptr->mode = STEPPER_MOTOR_STOP;
- stepper_motor_stop(stepmo_ptr);
- return;
- }
- }
- for (u8 i = 0; i < 4; i++)
- {
- if (__IO_L == stepmo_ptr->timing_tab_ptr[get_Offset(stepmo_ptr) * 4 + i])
- {
- gpio_direction_output(stepmo_ptr->io_tab_ptr[i], 1);
- }
- else
- {
- gpio_direction_output(stepmo_ptr->io_tab_ptr[i], 0);
- }
- }
- stepmo_ptr->step = (++stepmo_ptr->step) & (8 - 1); //+1然后對8取余
- }
- }
- }
復制代碼
所有資料51hei提供下載:
步進電機驅動程序.zip
(2.41 KB, 下載次數(shù): 23)
2021-1-27 11:10 上傳
點擊文件名下載附件
|