找回密码
 立即注册
查看: 102|回复: 7

控制步进电机到指定的位置, 大学生毕业设计

[复制链接]

该用户从未签到

3

主题

1

回帖

13

积分

新手上路

积分
13
发表于 2024-5-18 11:51:30 来自手机 | 显示全部楼层 |阅读模式
使用STC15IAPW4K58S4单片机,
通过输入0~99mm的距离, 控制pwm脉冲数量驱动控制步进电机到指定的位置,
请问各位大佬,这样的程序该怎么写


回复 送花

使用道具 举报

该用户从未签到

559

主题

9753

回帖

1万

积分

管理员

积分
14270
发表于 2024-5-19 08:48:37 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 192 天

    [LV.7]常住居民III

    9

    主题

    909

    回帖

    3535

    积分

    论坛元老

    积分
    3535
    发表于 2024-5-18 20:56:32 | 显示全部楼层
    要使用STC15IAPW4K58S4单片机通过输入0~99毫米的距离控制PWM脉冲数量,驱动步进电机到指定位置,可以参考以下步骤进行程序设计:

    1. 确定步进电机的参数
    首先,你需要知道步进电机的参数,比如每步的角度,以及步进电机的驱动模式(全步、半步或微步)。

    假设步进电机每步角度为1.8度(即200步/圈),如果每个PWM脉冲让电机前进一步,则每转一圈需要200个PWM脉冲。

    2. 确定每毫米需要多少步
    假设步进电机的传动机构是螺杆传动,步进电机每转一圈(200步)对应的线性移动距离为x毫米。

    则每毫米所需的步数为 200 / x。

    3. 编写程序
    以下是一个示例程序,用来根据输入的距离值,产生相应数量的PWM脉冲:

    */
    #include <STC15F2K60S2.H>

    // 假设传动机构每圈移动1毫米
    #define STEPS_PER_MM 200  // 200步/毫米

    // 定义步进电机引脚
    sbit STEP_PIN = P1^0;
    sbit DIR_PIN = P1^1;

    // 延时函数,模拟PWM频率
    void delay(unsigned int ms) {
        unsigned int i, j;
        for (i = ms; i > 0; i--)
            for (j = 110; j > 0; j--);
    }

    // 产生PWM脉冲
    void generate_pwm_pulse(unsigned int num_pulses) {
        unsigned int i;
        for (i = 0; i < num_pulses; i++) {
            STEP_PIN = 1;
            delay(1);  // 调整延时时间以改变PWM频率
            STEP_PIN = 0;
            delay(1);
        }
    }

    // 输入距离控制函数
    void move_stepper_to_position(unsigned int distance_mm) {
        unsigned int steps = distance_mm * STEPS_PER_MM;
        generate_pwm_pulse(steps);
    }

    // 主函数
    void main() {
        unsigned int distance_mm = 50;  // 设定目标距离为50毫米
       
        // 配置方向引脚,假设高电平为正转,低电平为反转
        DIR_PIN = 1;
       
        // 产生PWM脉冲,驱动步进电机
        move_stepper_to_position(distance_mm);
       
        while (1);
    }
    /*
    4. 输入处理
    如果你需要根据输入(比如通过键盘或串口输入)来控制距离,可以在主函数中加入输入处理的代码。

    例如,通过串口输入控制距离:

    */
    #include <stdio.h>
    #include <STC15F2K60S2.H>

    // 假设传动机构每圈移动1毫米
    #define STEPS_PER_MM 200  // 200步/毫米

    // 定义步进电机引脚
    sbit STEP_PIN = P1^0;
    sbit DIR_PIN = P1^1;

    // 串口初始化函数
    void uart_init(void) {
        SCON = 0x50;  // 配置串口工作模式1
        TMOD |= 0x20;  // 配置定时器1为8位自动重装载模式
        TH1 = 0xFD;  // 波特率9600
        TR1 = 1;  // 启动定时器1
        ES = 1;  // 使能串口中断
        EA = 1;  // 使能全局中断
    }

    // 串口接收中断服务程序
    void uart_isr(void) interrupt 4 {
        if (RI) {
            unsigned char received_data = SBUF;  // 读取接收到的数据
            RI = 0;  // 清除接收中断标志
            // 将接收到的数据转换为距离值
            unsigned int distance_mm = received_data - '0';  // 简单的字符到数字转换
            // 移动步进电机到指定位置
            move_stepper_to_position(distance_mm);
        }
    }

    // 延时函数,模拟PWM频率
    void delay(unsigned int ms) {
        unsigned int i, j;
        for (i = ms; i > 0; i--)
            for (j = 110; j > 0; j--);
    }

    // 产生PWM脉冲
    void generate_pwm_pulse(unsigned int num_pulses) {
        unsigned int i;
        for (i = 0; i < num_pulses; i++) {
            STEP_PIN = 1;
            delay(1);  // 调整延时时间以改变PWM频率
            STEP_PIN = 0;
            delay(1);
        }
    }

    // 输入距离控制函数
    void move_stepper_to_position(unsigned int distance_mm) {
        unsigned int steps = distance_mm * STEPS_PER_MM;
        generate_pwm_pulse(steps);
    }

    // 主函数
    void main() {
        uart_init();  // 初始化串口
       
        // 配置方向引脚,假设高电平为正转,低电平为反转
        DIR_PIN = 1;
       
        while (1);
    }
    /*
    这个程序通过串口接收输入距离,然后控制步进电机移动到指定位置。根据你的具体硬件配置和需求,可以进一步调整和优化代码。



    */

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    18 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    10

    主题

    309

    回帖

    1146

    积分

    金牌会员

    积分
    1146
    发表于 2024-5-18 22:57:39 | 显示全部楼层
    angmall 发表于 2024-5-18 20:56
    要使用STC15IAPW4K58S4单片机通过输入0~99毫米的距离控制PWM脉冲数量,驱动步进电机到指定位置,可以参考以 ...

    佬,我有个问题, 像 5v单片机驱动大功率电机的时候, 这个该怎么接线?

    点评

    直接控制话,你做自己做H桥,然后PWM驱动,要求不高可以不细分,直接按照三相六拍(三相) 两相四拍(两相)去开启管子 本坛子里有梁工写的步进电机驱动,搜一下,可以参考,简单的方式就是购置独立的驱动器,你只负责方向,脉冲  详情 回复 发表于 2024-5-19 01:55
    自信就会温和,温和就会坚定!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    21 小时前
  • 签到天数: 99 天

    [LV.6]常住居民II

    12

    主题

    492

    回帖

    1464

    积分

    荣誉版主

    积分
    1464
    发表于 2024-5-19 01:55:27 | 显示全部楼层
    本帖最后由 xiangzichen 于 2024-5-19 01:56 编辑
    嵌入式之路 发表于 2024-5-18 22:57
    佬,我有个问题, 像 5v单片机驱动大功率电机的时候, 这个该怎么接线?

    直接控制话,你要自己外接mos管,做H桥,然后PWM驱动
    要求不高可以不细分,直接按照三相六拍(三相) 两相四拍(两相)去开启管子
    不过简单的方式就是购置独立的驱动器,你只负责方向,脉冲就好了

    本坛子里梁工写的步进电机驱动可以参考:
    51开源 STC步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2160
    (出处: 国芯技术交流网站)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 192 天

    [LV.7]常住居民III

    9

    主题

    909

    回帖

    3535

    积分

    论坛元老

    积分
    3535
    发表于 2024-5-19 08:19:04 | 显示全部楼层
    嵌入式之路 发表于 2024-5-18 22:57
    佬,我有个问题, 像 5v单片机驱动大功率电机的时候, 这个该怎么接线?

    简单一点,可以用这种接法。

    StepMotorDrive.png



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    16 小时前
  • 签到天数: 188 天

    [LV.7]常住居民III

    26

    主题

    918

    回帖

    2342

    积分

    金牌会员

    积分
    2342
    发表于 2024-5-19 08:22:39 | 显示全部楼层
    一般外接驱动器,单片机负责发脉冲就行
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    18 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    10

    主题

    309

    回帖

    1146

    积分

    金牌会员

    积分
    1146
    发表于 2024-5-19 19:22:50 | 显示全部楼层
    angmall 发表于 2024-5-19 08:19
    简单一点,可以用这种接法。

    我明白了大佬, 这个还是偏硬件 很多我都看不懂。 我去看看模电吧
    自信就会温和,温和就会坚定!
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-3 21:39 , Processed in 0.098859 second(s), 64 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表