找回密码
 立即注册

QQ登录

只需一步,快速开始

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

原创的单片机步进电机开环驱动模块PCB文件+源程序

[复制链接]
跳转到指定楼层
楼主
本设计为步进电机开环驱动,使用STC15W408AS单片机作为主控,12V电源输入,使用两个A4950电机驱动,最高电流可达3.5A。三个输入使用光耦隔离,就算驱动板炸了也不会炸主控,四个拨码开关可调节细分和电流(扭矩),预留串口接口可烧程序或用于监控调试。
原理图,PCB,程序都已经上传附件。

成品图:正面
背面:
应用外观:
整体外观:

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg51.h>

  2. #define Timer0_time 35
  3. #define Timer0_H (65536-Timer0_time)/256
  4. #define Timer0_L (65536-Timer0_time)%256

  5. sbit led_green = P3^6;        //指示灯
  6. sbit led_red = P3^7;

  7. sbit in_clk = P3^2;                //输入信号上限1.2KHz
  8. sbit in_dir = P1^7;
  9. sbit in_en = P1^6;

  10. sbit sw0 = P2^0;                //选择开关
  11. sbit sw1 = P2^1;
  12. sbit sw2 = P2^2;
  13. sbit sw3 = P2^3;

  14. sbit in1 = P2^4;                //电机驱动
  15. sbit in2 = P2^5;
  16. sbit in3 = P2^6;
  17. sbit in4 = P2^7;

  18. unsigned char code step8_tab[8]={0x8F,0XAF,0X2F,0X6F,0X4F,0X5F,0X1F,0X9F};

  19. unsigned char duty=0,target=30,set=0,clin=0;
  20. char step=0;

  21. void delayms(unsigned int x)        //@35MHz
  22. {
  23.         unsigned int y;
  24.         for(x;x>0;x--)
  25.                 for(y=3000;y>0;y--);
  26. }

  27. void delay(unsigned int x)
  28. {
  29.         for(x;x>0;x--);
  30. }

  31. void sys_init()
  32. {
  33.         EX0=1;
  34.         IT0=1;
  35.        
  36.         TMOD=0X01;
  37.         TH0=Timer0_H;
  38.         TL0=Timer0_L;
  39.         EA=1;
  40.         ET0=1;
  41.         TR0=1;
  42. }

  43. void main()
  44. {
  45.         unsigned char div,cur;
  46.         P2=0X0F;
  47.         cur=P2 & 0x03;
  48.         div=P2 >>2;
  49.         div=div & 0x03;
  50.         switch(cur)                //拨码选择电流/扭矩
  51.         {
  52.                 case 0X03: target=30; break;               
  53.                 case 0X02: target=40; break;               
  54.                 case 0X01: target=55; break;               
  55.                 case 0X00: target=65; break;               
  56.                 default : target=30;break;
  57.         }
  58.         switch(div)                //拨码选择分频系数
  59.         {
  60.                 case 0X03: set=0; break;               
  61.                 case 0X02: set=2; break;               
  62.                 case 0X01: set=4; break;               
  63.                 case 0X00: set=8; break;               
  64.                 default : set=0;break;
  65.         }       
  66.        
  67.         P3=0XFF;
  68.        
  69.         sys_init();
  70.         while(1)
  71.         {
  72.                
  73.         }
  74. }

  75. void init0() interrupt 0
  76. {
  77.         unsigned char i;
  78.         clin++;
  79.         if(clin>=set)                //细分
  80.         {
  81.                         clin=0;
  82.                         if(in_en)
  83.                         {
  84.                                 if(in_dir)        //正转
  85.                                 {               
  86.                                         step++;
  87.                                         if(step>=8)
  88.                                                 step=0;
  89.                                         P2=step8_tab[step];
  90.                                        
  91.                                 }
  92.                                 else                                //反转
  93.                                 {
  94.                                         step--;
  95.                                         if(step<0)
  96.                                                 step=7;
  97.                                         P2=step8_tab[step];
  98.                                        
  99.                                 }
  100.                                
  101.                         }
  102.                                
  103.         }
  104. }

  105. void timer0() interrupt 1
  106. {
  107.         TH0=Timer0_H;
  108.         TL0=Timer0_L;
  109.         duty++;
  110.         if(duty>=100)
  111.                 duty=0;
  112.         (duty<target)?(P2=step8_tab[step]):(P2=0X0F);
  113. }
复制代码


所有资料51hei提供下载:
步进电机驱动.zip (59.1 KB, 下载次数: 24)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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