单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:6219|回复:5
打印上一主题下一主题

AVR stdio写的ATMEGA16控制步进电机正反转和速度

[复制链接]
跳转到指定楼层
楼主
ID:162249发表于 2017-1-18 09:32|只看该作者|只看大图回帖奖励
AVR stdio写的ATMEGA16控制步进电机正反转和速度,供大家免费参阅和批评

适合初学者,总共七个按键  三个按键控制三个速度正转,三个按键控制三个速度反转,一个按键控制停止。

本程序控制步进电机是和步进电机驱动器相连接的,所以脉冲只有一路,如果想直接连步进电机只需要稍加改动即可。


完整代码下载:
MEGA16stepmotor.zip(95.53 KB, 下载次数: 128)

主程序预览:
  1. #define F_CPU 800000UL
  2. #include< avr/io.h>
  3. #include< util/delay.h>
  4. #define INT8U unsigned int
  5. #define INT16U unsigned int

  6. const INT8U FFW[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};//一拍p0口输出8个脉冲

  7. //按键定义
  8. #define K1_DOWN()((PIND& _BV(PD0)) == 0x00)//K1:正转速度1
  9. #define K2_DOWN()((PIND& _BV(PD1)) == 0x00)//K2:正转速度2
  10. #define K3_DOWN()((PIND& _BV(PD2)) == 0x00)//K3:正转速度3
  11. #define K4_DOWN()((PIND& _BV(PD3)) == 0x00)//K4:停止
  12. #define K5_DOWN()((PIND& _BV(PD4)) == 0x00)//K5:反转速度1
  13. #define K6_DOWN()((PIND& _BV(PD5)) == 0x00)//K6:反转速度2
  14. #define K7_DOWN()((PIND& _BV(PD6)) == 0x00)//K7:反转速度3

  15. void STEP_MOTOR_FWRUN_1(INT8U n)
  16. {
  17.    INT8U i,j;
  18.   
  19.    for(i=0;i<n;i++)//转动n圈
  20.    {
  21.      for(j=0;j<16;j++)//循环输出16*8拍
  22.      {
  23.        //if (K1_DOWN())break;
  24.            if (K2_DOWN())break;
  25.            if (K3_DOWN())break;
  26.      if (K4_DOWN())return;//中途按下K4时电机停止转动
  27.       
  28.          if (K5_DOWN())break;
  29.            if (K6_DOWN())break;
  30.            if (K7_DOWN())break;
  31.        PORTB=FFW[j];
  32.        _delay_us(50);

  33. }
  34. PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点
  35. }
  36. }

  37. void STEP_MOTOR_FWRUN_2(INT8U n)
  38. {
  39.    INT8U i,j;
  40.   
  41.    for(i=0;i<n;i++)//转动n圈
  42.    {
  43.      for(j=0;j<16;j++)
  44.      {
  45.      if (K1_DOWN())break;
  46.          // if (K2_DOWN())break;
  47.            if (K3_DOWN())break;
  48.      if (K4_DOWN())return;//中途按下K4时电机停止转动

  49.          if (K5_DOWN())break;
  50.            if (K6_DOWN())break;
  51.            if (K7_DOWN())break;
  52.        PORTB=FFW[j];
  53.        _delay_us(150);

  54. }
  55. PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点
  56. }
  57. }

  58. void STEP_MOTOR_FWRUN_3(INT8U n)
  59. {
  60.    INT8U i,j;
  61.   
  62.    for(i=0;i<n;i++)//转动n圈
  63.    {
  64.      for(j=0;j<16;j++)
  65.      {
  66.      if (K1_DOWN())break;
  67.            if (K2_DOWN())break;
  68.          // if (K3_DOWN())break;
  69.      if (K4_DOWN())return;//中途按下K4时电机停止转动
  70.       
  71.          if (K5_DOWN())break;
  72.            if (K6_DOWN())break;
  73.            if (K7_DOWN())break;
  74.        PORTB=FFW[j];
  75.        _delay_us(300);

  76. }
  77. PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点
  78. }
  79. }


  80. void STEP_MOTOR_CWRUN_5(INT8U n)
  81. {
  82.    INT8U i,j;
  83.   
  84.    for(i=0;i<n;i++)//转动n圈
  85.    {
  86.      for(j=0;j<16;j++)
  87.      {
  88.      if (K1_DOWN())break;
  89.            if (K2_DOWN())break;
  90.            if (K3_DOWN())break;
  91.      if (K4_DOWN())return;//中途按下K4时电机停止转动
  92.       
  93.          // if (K5_DOWN())break;
  94.            if (K6_DOWN())break;
  95.            if (K7_DOWN())break;
  96.       
  97.        PORTB=FFW[j];
  98.        _delay_us(300);

  99. }
  100. PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点
  101. }
  102. }

  103. void STEP_MOTOR_CWRUN_6(INT8U n)
  104. {
  105.    INT8U i,j;
  106.   
  107.    for(i=0;i<n;i++)//转动n圈
  108.    {
  109.      for(j=0;j<16;j++)
  110.      {
  111.        if (K1_DOWN())break;
  112.            if (K2_DOWN())break;
  113.            if (K3_DOWN())break;
  114.      if (K4_DOWN())return;//中途按下K4时电机停止转动
  115.       
  116.          if (K5_DOWN())break;
  117.            //if (K6_DOWN())break;
  118.            if (K7_DOWN())break;
  119.       
  120.        PORTB=FFW[j];//方向为0时正转
  121.        _delay_us(150);

  122. }
  123. PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点
  124. }
  125. }

  126. void STEP_MOTOR_CWRUN_7(INT8U n)
  127. {
  128.    INT8U i,j;
  129.   
  130.    for(i=0;i<n;i++)//转动n圈
  131.    {
  132.      for(j=0;j<16;j++)
  133.      {   if (K1_DOWN())break;
  134.            if (K2_DOWN())break;
  135.            if (K3_DOWN())break;
  136.      if (K4_DOWN())return;//中途按下K4时电机停止转动
  137.     
  138.          if (K5_DOWN())break;
  139.            if (K6_DOWN())break;
  140.          // if (K7_DOWN())break;
  141.        PORTB=FFW[j];
  142.        _delay_us(50);

  143. }
  144. PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点
  145. }
  146. }
  147. void beep()
  148. {
  149.      PORTC=0x40;
  150.      _delay_ms(120);
  151.      PORTC=0X00;
  152. }

  153. void initonbeep()
  154. {
  155. PORTC=0x40;
  156. _delay_ms(120);
  157. PORTC=0X00;
  158. _delay_ms(120);
  159. PORTC=0x40;
  160. _delay_ms(120);
  161. PORTC=0X00;
  162. _delay_ms(120);
  163. PORTC=0x40;
  164. _delay_ms(120);
  165. PORTC=0X00;
  166. _delay_ms(120);
  167. PORTC=0x40;
  168. _delay_ms(120);
  169. PORTC=0X00;
  170. }


  171. int main()
  172. {
  173.    INT8U r=65535;
  174.    DDRB=0xFF;PORTB=FFW[0];   //控 制输出
  175.    DDRD=0X00;PORTD=0xFF;     //按键输入
  176.    DDRA=0X00;PORTA=0xFF; //方向信号
  177.    DDRC=0XFF;PORTC=0x00; //蜂鸣器
  178.    initonbeep ();
  179.   
  180.    while(1)
  181.    {
  182.   

  183.      if(K1_DOWN())
  184.      {
  185.            _delay_us(200);
  186.            if(K1_DOWN())
  187.      {
  188.            beep();
  189.        //while(K1_DOWN());   //等待 K1 释放
  190.            PORTA=0x00;       //方向信号为0
  191.        STEP_MOTOR_FWRUN_1(r);//点击正转r圈
  192.           
  193.      }
  194.        }      
  195.        if(K2_DOWN())
  196.      {
  197.            _delay_us(200);
  198.            if(K2_DOWN())
  199.      {
  200.            beep();
  201.        //while(K1_DOWN());   //等待 K1 释放
  202.            PORTA=0x00;       //方向信号为0
  203.        STEP_MOTOR_FWRUN_2(r);//点击正转r圈
  204.      }
  205.        }      
  206.        if(K3_DOWN())
  207.      {
  208.            _delay_us(200);
  209.            if(K3_DOWN())
  210.      {
  211.            beep();
  212.        //while(K1_DOWN());   //等待 K1 释放
  213.            PORTA=0x00;       //方向信号为0
  214.        STEP_MOTOR_FWRUN_3(r);//点击正转r圈
  215.      }
  216.        }      
  217.      if(K5_DOWN())
  218.      {
  219.              _delay_us(200);
  220.            if(K5_DOWN())
  221.      {
  222.            beep();
  223.        //while(K2_DOWN());   //等待K2释放
  224.        PORTA=0x01;       //方向信号为1
  225.        STEP_MOTOR_CWRUN_5(r); //电机反转r圈
  226.      }
  227.        }      
  228.        if(K6_DOWN())
  229.      {
  230.              _delay_us(200);
  231.            if(K6_DOWN())
  232.      {
  233.            beep();
  234.        //while(K2_DOWN());   //等待K2释放
  235.        PORTA=0x01;       //方向信号为1
  236.        STEP_MOTOR_CWRUN_6(r); //电机反转r圈
  237.      }
  238.        }      
  239.        if(K7_DOWN())
  240.      {
  241.              _delay_us(200);
  242.            if(K7_DOWN())
  243.      {
  244.            beep();
  245.        //while(K2_DOWN());   //等待K2释放
  246.        PORTA=0x01;       //方向信号为1
  247.        STEP_MOTOR_CWRUN_7(r); //电机反转r圈
  248.      }
  249.        }      
  250.         
  251.      }
  252. }
复制代码
沙发
ID:1发表于 2017-2-12 17:19|只看该作者
好资料,51黑有你更精彩!!!
板凳
ID:127977发表于 2017-4-6 22:13|只看该作者
学习一下,谢谢了
地板
ID:198413发表于 2017-5-8 22:30|只看该作者
楼主可以给我私发一份吗
5#
ID:237210发表于 2017-10-9 19:10|只看该作者
学习了
6#
ID:194122发表于 2020-4-2 10:35|只看该作者
学习了  帮助很大

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网