[应用方案] 单片机对步进电机的控制

[复制链接]
673|1
 楼主| claretttt 发表于 2024-1-15 10:33 | 显示全部楼层 |阅读模式
  1. #define uchar unsigned char
  2. // 使用8步法对步进电机进行控制的数组
  3. uchar st[]={0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01}; //1001, 1000, 1100, 0100, 0110, 0010, 0011, 0001
  4. #define uint unsigned int

  5. void delay(uint t){         // 模糊延时(不精确的延时)
  6.         uint i=0, j=0;
  7.         for(i=0; i<t; i++){
  8.                 for(j=0; j<120; j++);
  9.         }
  10. }

  11. void stepper(){            // 电机控制函数
  12.         int i=0;
  13.         for(i=0; i<8; i++){   //  从左往右取值是正转
  14.         for(i=7; i>0; i--){     // 从右往左取值是反转
  15.                 P2 = st[i];
  16.                 delay(v);         // 延时越短  电机转动的速度越快
  17.         }
  18. }



  19. void main(){                   // 主函数
  20.         inittimer();
  21.         while(1){
  22.                 stepper();      //  调用电机控制函数
  23.         }
  24. }


  1. #define uchar unsigned char
  2. // 使用8步法对步进电机进行控制的数组
  3. uchar st[]={0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01}; //1001, 1000, 1100,0100, // 0110, 0010, 0011, 0001
  4. #define uint unsigned int
  5. uchar count=0, num=0;    // 定义中断中使用的变量

  6. void inittimer(){               // 计时器初始化函数
  7.         TMOD = 0x01;
  8.         TH0 = (65536-50000)/256;
  9.         TL0 = (65536-50000)%256;
  10.         ET0 = 1;
  11.         EA = 1;
  12.         TR0 =1;
  13. }

  14. void main(){                   // 主函数
  15.         inittimer();
  16.         while(1){
  17.                 //stepper();
  18.         }
  19. }
  20. //***********************************************************************************
  21. //   中断服务函数每隔50毫秒进来1次
  22. //        赋初值就是确定下一次计时多长时间。
  23. ///**********************************************************************************
  24. void zhongduan() interrupt 1{              // 中断服务函数  每隔50毫秒进来一次
  25.         TH0 =  0x3C ; //(65536-50000)/256;  // 3C   高8位赋初值
  26.         TL0 = 0xB0 ;//(65536-50000)%256;  // B0     低8位赋初值
  27.         count++;                                  // 每隔50毫秒 count自加1
  28.         if(count==20){                            // 如果count等于20了,证明加了20次了,也就是1秒钟了
  29.                 P2 = st[num++];                             // P2等于数组st的第num个值(从第0个到第8个)   
  30.                 if(num==8){                                 // 如果num等于8了,就是st的值从头取到尾了。
  31.                         num=0;                                       // 就将num置0,从头取
  32.                 }
  33.                 count = 0;                                  // 将count置0,从头计算
  34.         }
  35. }


花间一壶酒sd 发表于 2024-8-23 15:52 | 显示全部楼层
你的代码中有一些需要修正的问题,特别是在控制步进电机的循环中。
#define uchar unsigned char
#define uint unsigned int

uchar st[] = {0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01}; // 1001, 1000, 1100, 0100, 0110, 0010, 0011, 0001

void delay(uint t) {  // 模糊延时(不精确的延时)
    uint i = 0, j = 0;
    for(i = 0; i < t; i++) {
        for(j = 0; j < 120; j++);
    }
}

void stepper_forward(uint v) {  // 正转函数
    int i = 0;
    for(i = 0; i < 8; i++) {    // 从左往右取值是正转
        P2 = st[i];
        delay(v);               // 延时越短  电机转动的速度越快
    }
}

void stepper_backward(uint v) {  // 反转函数
    int i = 0;
    for(i = 7; i >= 0; i--) {   // 从右往左取值是反转
        P2 = st[i];
        delay(v);               // 延时越短  电机转动的速度越快
    }
}

void main() {  // 主函数
    inittimer();
    while(1) {
        stepper_forward(100);   // 正转,传入一个适当的延时时间
        delay(1000);            // 暂停1秒
        stepper_backward(100);  // 反转,传入一个适当的延时时间
        delay(1000);            // 暂停1秒
    }
}


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

本版积分规则

76

主题

1700

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部