找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9626|回复: 4
收起左侧

PLC控制步进电机脉冲信号发生器电路原理图PCB与单片机源码

  [复制链接]
ID:284341 发表于 2018-2-19 02:19 | 显示全部楼层 |阅读模式
Altium Designer画的步进电机脉冲控制板电路原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

步进电机脉冲信号发生器与plc的接线图如下:
应用举例.JPG
实物图:
宝贝标注.jpg
ALIM0002.jpg

【简要说明】
一、 尺寸:83mmX50mm X 15mm  长X宽X高
二、 主要芯片:单片机控制
三、 工作电压:供电电压直流5~24伏(宽电压工作);
四、 特点:
1、单路信号输出。
2、输出占空比约为百分之五十的方波波形                 
4、输出频率由按键调节,加速 减速按键控制
5、输出频率范围1~4KHZ(40种脉冲频率调节)
6、输出电压(直流5V)
7、输出电流225毫安(MAX)
8、上升/下降时间100 ns

单片机控制程序,带掉电记忆功能源程序如下:
  1. /********************************************************************
  2.                             汇诚科技
  3. 使用芯片:STC15F104E
  4. 晶振:33MHZ
  5. 编译环境:Keil
  6. 作者:zhangxinchunleo
  7. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     

  8. *********************************************************************/
  9. /********************************************************************/
  10. #include "reg52.h"
  11. #include <intrins.H>
  12. #define uchar unsigned char //宏定义字符型变量
  13. #define uint  unsigned int        //宏定义整型变量
  14. /********************************************************************
  15.                             寄存器设置
  16. *********************************************************************/
  17. sfr IAP_DATA  =0xc2;         //数据寄存器
  18. sfr IAP_ADDRH =0xc3;         //地址寄存器
  19. sfr IAP_ADDRL =0xc4;         //地址寄存器
  20. sfr IAP_CMD   =0xc5;     //命令寄存器
  21. sfr IAP_TRIG  =0xc6;          //触发寄存器
  22. sfr IAP_CONTR =0xc7;     //擦除寄存器

  23. /********************************************************************
  24.                             命令定义
  25. *********************************************************************/
  26. #define CMD_IDLE     0         //EEPROM无操作
  27. #define CMD_READ     1         //读取字节
  28. #define CMD_PROGRAM  2         //写入字节
  29. #define CMD_ERASE    3         //擦除字节
  30. /********************************************************************
  31.                        编程周期由晶振决定
  32. *********************************************************************/
  33. //#define ENABLE_IAP 0X80         //编程周期由晶振决定(如果<30MHZ选用此项)
  34. //#define ENABLE_IAP 0X81         //编程周期由晶振决定(如果<24MHZ选用此项)
  35. //#define ENABLE_IAP 0X82         //编程周期由晶振决定(如果<20MHZ选用此项)
  36.   #define ENABLE_IAP 0X83         //编程周期由晶振决定(如果<12MHZ选用此项)
  37. //#define ENABLE_IAP 0X84         //编程周期由晶振决定(如果<6MHZ选用此项)
  38. //#define ENABLE_IAP 0X85         //编程周期由晶振决定(如果<3MHZ选用此项)
  39. //#define ENABLE_IAP 0X86         //编程周期由晶振决定(如果<2MHZ选用此项)
  40. //#define ENABLE_IAP 0X87         //编程周期由晶振决定(如果<1MHZ选用此项)

  41. #define IAP_ADDRESS 0X0000         //内部EEPROM地址
  42. /********************************************************************
  43.                            定义继输入输出
  44. *********************************************************************/
  45. sbit JIA=P3^1;         //
  46. sbit JIAN=P3^0;         //
  47. sbit EN=P3^2;         //
  48. sbit P35=P3^5;         //
  49. bit  write=0;
  50. /********************************************************************
  51.                             初始定义
  52. *********************************************************************/
  53. uint tcnt1; //脉冲计数
  54. uint t1;
  55. bit write;
  56. uchar sudu;

  57. /********************************************************************
  58.                             延时100MS函数
  59. *********************************************************************/

  60. void Delay100ms()               
  61. {
  62.         uchar i, j, k;
  63.         _nop_();
  64.         i = 5;
  65.         j = 144;
  66.         k = 71;
  67.         do
  68.         {
  69.                 do
  70.                 {
  71.                         while (--k);
  72.                 } while (--j);
  73.         } while (--i);
  74. }          
  75. /********************************************************************
  76.                             操作函数
  77. *********************************************************************/
  78. void IapIdle()
  79. {
  80.         IAP_CONTR=0;
  81.         IAP_CMD=0;
  82.         IAP_TRIG=0;
  83.         IAP_ADDRH=0X80;
  84.         IAP_ADDRL=0;
  85. }
  86. /********************************************************************
  87.                             读取一个字节函数
  88. *********************************************************************/
  89. uchar IapReadByte(uint addr)
  90. {
  91.         uchar dat;  
  92.         IAP_CONTR=ENABLE_IAP;
  93.         IAP_CMD=CMD_READ;
  94.         IAP_ADDRL=addr;
  95.         IAP_ADDRH=addr>>8;
  96.         IAP_TRIG=0X5A;
  97.         IAP_TRIG=0XA5;
  98.         _nop_();
  99.         _nop_();
  100.         _nop_();
  101.         dat=IAP_DATA;
  102.         IapIdle();
  103.         return dat;
  104. }

  105. /********************************************************************
  106.                             写入一个字节函数
  107. *********************************************************************/
  108. void IapProgramByte(uint addr,uchar dat)
  109. {

  110.         IAP_CONTR=ENABLE_IAP;
  111.         IAP_CMD=CMD_PROGRAM;
  112.         IAP_ADDRL=addr;
  113.         IAP_ADDRH=addr>>8;
  114.         IAP_DATA=dat;
  115.         IAP_TRIG=0X5A;
  116.         IAP_TRIG=0XA5;
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         IapIdle();
  121. }
  122. /********************************************************************
  123.                             擦除一个字节函数
  124. *********************************************************************/
  125. void IapEraseSector(uint addr)
  126. {
  127.         IAP_CONTR=ENABLE_IAP;
  128.         IAP_CMD=CMD_ERASE;
  129.         IAP_ADDRL=addr;
  130.         IAP_ADDRH=addr>>8;
  131.         IAP_TRIG=0X5A;
  132.         IAP_TRIG=0XA5;
  133.         _nop_();
  134.         _nop_();
  135.         _nop_();
  136.         IapIdle();
  137. }

  138. /********************************************************************
  139.                             按键判断函数
  140. *********************************************************************/
  141. void KEY()

  142. {

  143. if(JIA==0){Delay100ms();if(JIA==0){Delay100ms();sudu++;write=1;if(sudu>=30)sudu=30;while(!JIA);Delay100ms();}}
  144. if(JIAN==0){Delay100ms();if(JIAN==0){Delay100ms();sudu--;write=1;if(sudu<=1)sudu=1;while(!JIAN);Delay100ms();}}
  145. if(EN==0)TR0=1;else TR0=0;

  146. switch(sudu)
  147. {
  148. case 1: t1=1;break;//2K
  149. case 2: t1=2;break;//1.6k
  150. case 3: t1=3;break;//1.33k
  151. case 4: t1=4;break;//2K
  152. case 5: t1=5;break;//1.6k
  153. case 6: t1=6;break;//1.33k
  154. case 7: t1=7;break;//1.14k
  155. case 8: t1=8;break;//1k
  156. case 9: t1=9;break;// 880
  157. case 10: t1=10;break;// 800
  158. case 11: t1=12;break;// 660
  159. case 12: t1=14;break;// 580
  160. case 13: t1=16;break;//        500
  161. case 14: t1=18;break;//        450
  162. case 15: t1=20;break;//        400
  163. case 16: t1=22;break;//        360
  164. case 17: t1=23;break;//        350
  165. case 18: t1=26;break;//        300
  166. case 19: t1=30;break;//        260
  167. case 20: t1=33;break;//        240
  168. case 21: t1=37;break;//        220
  169. case 22: t1=41;break;//        200
  170. case 23: t1=50;break;//        160
  171. case 24: t1=60;break;//        135
  172. case 25: t1=65;break;//        125
  173. case 26: t1=75;break;//        110
  174. case 27: t1=80;break;//        100
  175. case 28: t1=95;break;//        84
  176. case 29: t1=120;break;//60
  177. case 30: t1=150;break;//50
  178. case 31: t1=300;break;//30
  179. case 32: t1=1000;break;//8
  180. case 33: t1=10000;break;//1
  181. case 34: t1=20000;break;//1
  182. case 35: t1=30000;break;//1
  183. case 36: t1=40000;break;//1
  184. case 37: t1=60000;break;//1

  185. default:break;
  186. }
  187. }

  188. /********************************************************************
  189.                             定时中断服务函数
  190. *********************************************************************/
  191. void t0(void) interrupt 1 using 0 //定时中断服务函数
  192. {

  193.          tcnt1++;
  194.          if(tcnt1>=t1)
  195.            {
  196.              tcnt1=0;
  197.          P35=!P35;
  198.             }

  199. }

  200. /********************************************************************
  201.                             主函数
  202. *********************************************************************/
  203. void main()
  204. {
  205.    
  206.         uchar Q;
  207.         TMOD=0x02; //定时器工作在方式2
  208.         TH0=0x06; //对TH0 TL0 赋值
  209.         TL0=0x06;
  210.         TR0=0; //关定时
  211.         ET0=1; //开定时器
  212.         EA=1;  //开总中断
  213.         P35=0;//脉冲输出脚
  214.         Q=IapReadByte(0);
  215.         sudu=Q;
  216.        
  217.         while(1)
  218.     {
  219.     KEY();
  220.     if(write==1)
  221.     {
  222.    write=0;
  223.       IapEraseSector(0);            //擦除扇区
  224.       IapProgramByte(0,sudu);        //写入数据
  225. ……………………

  226. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
步进电机脉冲控制板DXP资料.rar (353.87 KB, 下载次数: 68)

评分

参与人数 1黑币 +10 收起 理由
qzyhlf + 10

查看全部评分

回复

使用道具 举报

ID:171948 发表于 2021-11-3 10:31 | 显示全部楼层
被标题误导了,不是PLC ,是单片机STC15F104E
回复

使用道具 举报

ID:739610 发表于 2021-11-7 20:55 | 显示全部楼层
PLC本身就有高速脉冲输出功能  Y0接驱动器PUL-  Y1接DIR-  不太明白这块板子的作用
回复

使用道具 举报

ID:725249 发表于 2021-12-7 12:31 | 显示全部楼层
感谢分享,这资料真是太棒了!
回复

使用道具 举报

ID:1026069 发表于 2022-5-13 07:15 | 显示全部楼层
感谢分享,这资料真是太棒了!以前都是某一个宝上买的,现在可以自己做了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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