找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5724|回复: 5
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
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. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

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