初始化:
stepper_motor_init(stepper_motor_a_ptr);
stepper_motor_init(stepper_motor_b_ptr);
定时器需要放置的函数: 定时器暂用1ms,可根据应用修改
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 参数说明:
1、结构体指针
2、旋转方向
STEPPER_MOTOR_F 顺时针
STEPPER_MOTOR_R 逆时针
STEPPER_MOTOR_STOP 停止
3、旋转角度 (实际转动角度 = angle * 5.625 / 8)
4、旋转速度 1 最快,数值越大,速度越慢
单片机源程序如下:
- /*
- * @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, 下载次数: 23)
|