找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于MC9S12X128的直流电机与步进电机源代码

[复制链接]
跳转到指定楼层
楼主
ID:338476 发表于 2018-5-26 00:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于MC9S12X128的直流电机与步进电机单片机源程序如下:
  1. /********************************************
  2. 龙邱MC9S12XS128函数库
  3. Designed by Cherish
  4. E-mail:chiusir@yahoo.cn
  5. 软件版本:V1.0
  6. 最后更新:2015年12月28日
  7. ------------------------------------
  8. Code Warrior 5.1
  9. 下载器:BDM2.3
  10. Target : MC9S12XS128
  11. 备注;基于库版本程序编写
  12. **********************************************/
  13. #include "include.h"

  14. unsigned char data[20],data1[7]={0x7F,0x3F,0x1F,0xF,0x7,0x3,0x1};
  15. unsigned int falg=1,falg1=3,falg2=3,falg3=0,falg4=14,kkk;
  16. void delayms(int ms)            //延时函数
  17. {   
  18.    int ii,jj;
  19.    if (ms<1) ms=1;
  20.    for(ii=0;ii<ms;ii++)
  21.      for(jj=0;jj<3338;jj++);    //40MHz--1ms      
  22. }                        
  23. void bu1()//步进电机第一步
  24. {PWM_Change_Duty(PWM2,0);//B_
  25. PWM_Change_Duty(PWM3,100);//A
  26. PWM_Change_Duty(PWM4,0);//B
  27. PWM_Change_Duty(PWM5,0);//A_//  A-AB-B-BA_-A_-A_B_-B_-B_A-A
  28.        
  29. }
  30. void bu2()//2步
  31. {PWM_Change_Duty(PWM2,0);
  32. PWM_Change_Duty(PWM3,100);
  33. PWM_Change_Duty(PWM4,100);
  34. PWM_Change_Duty(PWM5,0);
  35.        
  36. }
  37. void bu3()
  38. {PWM_Change_Duty(PWM2,0);
  39. PWM_Change_Duty(PWM3,0);
  40. PWM_Change_Duty(PWM4,100);
  41. PWM_Change_Duty(PWM5,0);
  42.        
  43. }
  44. void bu4()
  45. {PWM_Change_Duty(PWM2,0);
  46. PWM_Change_Duty(PWM3,0);
  47. PWM_Change_Duty(PWM4,100);
  48. PWM_Change_Duty(PWM5,100);
  49.        
  50. }
  51. void bu5()
  52. {PWM_Change_Duty(PWM2,0);
  53. PWM_Change_Duty(PWM3,0);
  54. PWM_Change_Duty(PWM4,0);
  55. PWM_Change_Duty(PWM5,100);
  56.        
  57. }
  58. void bu6()
  59. {PWM_Change_Duty(PWM2,100);
  60. PWM_Change_Duty(PWM3,0);
  61. PWM_Change_Duty(PWM4,0);
  62. PWM_Change_Duty(PWM5,100);
  63.        
  64. }
  65. void bu7()
  66. {PWM_Change_Duty(PWM2,100);
  67. PWM_Change_Duty(PWM3,0);
  68. PWM_Change_Duty(PWM4,0);
  69. PWM_Change_Duty(PWM5,0);
  70.        
  71. }
  72. void bu8()
  73. {PWM_Change_Duty(PWM2,100);
  74. PWM_Change_Duty(PWM3,100);
  75. PWM_Change_Duty(PWM4,0);
  76. PWM_Change_Duty(PWM5,0);
  77.        
  78. }
  79. void bu()//步进电机整体程序
  80. {
  81. int i;
  82. int kkk;//速度标志
  83. kkk=falg4;
  84. //步进电机顺转
  85. if(falg3==0)
  86. {
  87.         for(i=0;i<200;i++)
  88. {
  89. //按键减速选择
  90. if(PORTE_PE5==0)
  91.   {
  92.   while(PORTE_PE5==0);
  93.    
  94.   falg4++;
  95.   if(falg4>17)
  96.   {
  97.           falg4=17;
  98.   }
  99.   delayms(20);//防抖动
  100.    break;       
  101.   }
  102.   //按键加速选择
  103.   if(PORTE_PE3==0)
  104.   {
  105.   
  106.   while(PORTE_PE3==0);
  107.   falg4--;
  108.   if(falg4==10)
  109.   {
  110.           falg4=11;
  111.   }
  112.   delayms(20);       
  113.    break;
  114.   }
  115.   //切换直流和步进
  116. if(PORTE_PE2==0)
  117.   {
  118.   while(PORTE_PE2==0);
  119.   delayms(20);
  120.   if(falg==0)
  121.   {
  122.           falg=1;//直流步进标志
  123.           PWM_Change_Duty(PWM4,100);
  124. PWM_Change_Duty(PWM5,0);
  125.   }
  126.   else
  127.   {        falg=0;
  128.          
  129.   }
  130. // PORTB_PB1=0;
  131.   break;       
  132.   }
  133. PWM_Change_Duty(PWM0,100);
  134.         PWM_Change_Duty(PWM1,100);
  135.                 DDRB=~data1[17-falg4];//指示灯
  136.         bu1();
  137. delayms(kkk);
  138.   bu2();
  139. delayms(kkk);
  140. bu3();
  141. delayms(kkk);
  142. bu4();
  143. delayms(kkk);
  144. bu5();
  145. delayms(kkk);
  146. bu6();
  147. delayms(kkk);
  148. bu7();
  149. delayms(kkk);
  150. bu8();
  151. delayms(kkk);
  152. //切换逆转
  153.   if(PORTE_PE7==0)
  154.   {
  155.   while(PORTE_PE7==0);
  156.           falg3=1;//步进状态标志
  157.          
  158.           delayms(20);
  159.           break;
  160.   }       
  161.   //切换停止
  162.    if(PORTB_PB0==0)
  163.   {
  164.   while(PORTB_PB0==0);
  165.   falg3=2;
  166.    delayms(20);
  167.    break;
  168.          
  169.   }
  170. }
  171. }
  172. //步进电机逆转
  173. else if(falg3==1)
  174. {
  175.         for(i=0;i<200;i++)
  176. {
  177. if(PORTE_PE5==0)
  178.   {
  179.   while(PORTE_PE5==0);
  180.    
  181.   falg4++;
  182.   if(falg4>17)
  183.   {
  184.           falg4=17;
  185.   }

  186.   delayms(20);       
  187.    break;
  188.   }
  189.   if(PORTE_PE3==0)
  190.   {
  191.   
  192.   while(PORTE_PE3==0);
  193.   falg4--;
  194.   if(falg4==10)
  195.   {
  196.           falg4=11;
  197.   }
  198.   delayms(20);
  199.    break;       
  200.   }
  201. if(PORTE_PE2==0)
  202.   {
  203.   while(PORTE_PE2==0);
  204.   delayms(20);
  205.   if(falg==0)
  206.   {
  207.           falg=1;
  208.           PWM_Change_Duty(PWM4,100);
  209. PWM_Change_Duty(PWM5,0);
  210.   }
  211.   else
  212.   {        falg=0;
  213.          
  214.   }
  215. // PORTB_PB1=0;
  216.           break;
  217.   }
  218. PWM_Change_Duty(PWM0,100);
  219.         PWM_Change_Duty(PWM1,100);
  220.                 DDRB=~data1[17-falg4];
  221.                 bu8();
  222. delayms(kkk);
  223.   bu7();
  224. delayms(kkk);
  225. bu6();
  226. delayms(kkk);
  227. bu5();
  228. delayms(kkk);
  229. bu4();
  230. delayms(kkk);
  231. bu3();
  232. delayms(kkk);
  233. bu2();
  234. delayms(kkk);
  235. bu1();
  236. delayms(kkk);
  237. //切换顺转
  238. if(PORTE_PE6==0)
  239.   {
  240.   while(PORTE_PE6==0);
  241. falg3=0;
  242. delayms(20);
  243.   break;
  244.          
  245.   }
  246.    if(PORTB_PB0==0)
  247.   {
  248.   while(PORTB_PB0==0);
  249.   falg3=2;
  250.    delayms(20);
  251.    break;
  252.          
  253.   }
  254.   
  255. }
  256. }
  257. //停止步进电机
  258. else
  259. {
  260. if(PORTE_PE2==0)
  261.   {
  262.   while(PORTE_PE2==0);
  263.   delayms(20);
  264.   if(falg==0)
  265.   {
  266.           falg=1;
  267.           PWM_Change_Duty(PWM4,100);
  268. PWM_Change_Duty(PWM5,0);
  269.   }
  270.   else
  271.   {        falg=0;
  272.          
  273.   }
  274.          
  275.   }
  276.    if(PORTE_PE6==0)
  277.   {
  278.   while(PORTE_PE6==0);
  279. falg3=0;
  280. delayms(20);
  281.          
  282.   }
  283.    if(PORTE_PE7==0)
  284.   {
  285.   while(PORTE_PE7==0);
  286.           falg3=1;       
  287.           delayms(20);
  288.   }
  289.   
  290.         PWM_Change_Duty(PWM0,0);
  291.         PWM_Change_Duty(PWM1,0);
  292. }

  293. }
  294. void main(void)
  295. {

  296. unsigned char LedCnt=0;
  297.   DDRB = 0x00;
  298.   /* put your own code here */
  299.   PLL_Init(PLL160);  
  300.         EnableInterrupts;
  301. PWM_Init(PWM0,100,100);
  302. PWM_Init(PWM1,100,100);
  303. PWM_Init(PWM2,100,100);
  304. PWM_Init(PWM3,100,0);
  305. PWM_Init(PWM4,100,100);
  306. PWM_Init(PWM5,100,0);
  307. while(1)
  308. {
  309.          //下面直流和步进差不多
  310.   if(PORTE_PE2==0)
  311.   {
  312.   while(PORTE_PE2==0);
  313.   delayms(20);
  314.   if(falg==0)
  315.   {
  316.           falg=1;
  317.           PWM_Change_Duty(PWM4,100);
  318. PWM_Change_Duty(PWM5,0);
  319.   }
  320.   else
  321.   {        falg=0;
  322.          
  323.   }        
  324.   }
  325.   if(falg==1)
  326.   {
  327.   if(PORTE_PE6==0)
  328.   { ;
  329.   while(PORTE_PE6==0);
  330.   PWM_Change_Duty(PWM4,100);
  331. PWM_Change_Duty(PWM5,0);
  332.          
  333.   }
  334.   if(PORTE_PE7==0)
  335.   {
  336.   while(PORTE_PE7==0);
  337.   PWM_Change_Duty(PWM4,0);
  338.   PWM_Change_Duty(PWM5,100);
  339.          
  340.   }
  341. if(PORTE_PE3==0)
  342.   {
  343.   while(PORTE_PE3==0);
  344.    if(falg1==10)
  345.   {falg1=3;
  346.          
  347.   }
  348.   falg1++;
  349.   if(falg1>7)
  350.   {
  351.           falg1=7;
  352.   }
  353.          
  354.   }
  355.   if(PORTE_PE5==0)
  356.   {
  357.   
  358.   while(PORTE_PE5==0);
  359.   if(falg1==10)
  360.   {falg1=3;
  361.          
  362.   }
  363.   falg1--;
  364.   if(falg1==0)
  365.   {
  366.           falg1=1;
  367.   }
  368.          
  369.   }
  370.   if(falg1!=10)
  371.   {
  372.           PWM_Change_Duty(PWM1,35+falg1*2);
  373.           DDRB=~data1[falg1-1];
  374.   }
  375.   
  376.   if(PORTB_PB0==0)
  377.   {
  378.   PWM_Change_Duty(PWM1,0);
  379.   falg1=10;
  380.   while(PORTB_PB0==0);
  381.          
  382.   }
  383.   delayms(20);
  384.          
  385.   }
  386.   else
  387.   {
  388.           bu();
  389.   
  390. }
  391. }
  392. }
复制代码

main.docx

15.22 KB, 下载次数: 5, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:1 发表于 2018-5-26 02:26 | 只看该作者
需要补充原理图和完整源码才能获得100积分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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