|
基于MC9S12X128的直流电机与步进电机单片机源程序如下:
- /********************************************
- 龙邱MC9S12XS128函数库
- Designed by Cherish
- E-mail:chiusir@yahoo.cn
- 软件版本:V1.0
- 最后更新:2015年12月28日
- ------------------------------------
- Code Warrior 5.1
- 下载器:BDM2.3
- Target : MC9S12XS128
- 备注;基于库版本程序编写
- **********************************************/
- #include "include.h"
- unsigned char data[20],data1[7]={0x7F,0x3F,0x1F,0xF,0x7,0x3,0x1};
- unsigned int falg=1,falg1=3,falg2=3,falg3=0,falg4=14,kkk;
- void delayms(int ms) //延时函数
- {
- int ii,jj;
- if (ms<1) ms=1;
- for(ii=0;ii<ms;ii++)
- for(jj=0;jj<3338;jj++); //40MHz--1ms
- }
- void bu1()//步进电机第一步
- {PWM_Change_Duty(PWM2,0);//B_
- PWM_Change_Duty(PWM3,100);//A
- PWM_Change_Duty(PWM4,0);//B
- PWM_Change_Duty(PWM5,0);//A_// A-AB-B-BA_-A_-A_B_-B_-B_A-A
-
- }
- void bu2()//2步
- {PWM_Change_Duty(PWM2,0);
- PWM_Change_Duty(PWM3,100);
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
-
- }
- void bu3()
- {PWM_Change_Duty(PWM2,0);
- PWM_Change_Duty(PWM3,0);
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
-
- }
- void bu4()
- {PWM_Change_Duty(PWM2,0);
- PWM_Change_Duty(PWM3,0);
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,100);
-
- }
- void bu5()
- {PWM_Change_Duty(PWM2,0);
- PWM_Change_Duty(PWM3,0);
- PWM_Change_Duty(PWM4,0);
- PWM_Change_Duty(PWM5,100);
-
- }
- void bu6()
- {PWM_Change_Duty(PWM2,100);
- PWM_Change_Duty(PWM3,0);
- PWM_Change_Duty(PWM4,0);
- PWM_Change_Duty(PWM5,100);
-
- }
- void bu7()
- {PWM_Change_Duty(PWM2,100);
- PWM_Change_Duty(PWM3,0);
- PWM_Change_Duty(PWM4,0);
- PWM_Change_Duty(PWM5,0);
-
- }
- void bu8()
- {PWM_Change_Duty(PWM2,100);
- PWM_Change_Duty(PWM3,100);
- PWM_Change_Duty(PWM4,0);
- PWM_Change_Duty(PWM5,0);
-
- }
- void bu()//步进电机整体程序
- {
- int i;
- int kkk;//速度标志
- kkk=falg4;
- //步进电机顺转
- if(falg3==0)
- {
- for(i=0;i<200;i++)
- {
- //按键减速选择
- if(PORTE_PE5==0)
- {
- while(PORTE_PE5==0);
-
- falg4++;
- if(falg4>17)
- {
- falg4=17;
- }
- delayms(20);//防抖动
- break;
- }
- //按键加速选择
- if(PORTE_PE3==0)
- {
-
- while(PORTE_PE3==0);
- falg4--;
- if(falg4==10)
- {
- falg4=11;
- }
- delayms(20);
- break;
- }
- //切换直流和步进
- if(PORTE_PE2==0)
- {
- while(PORTE_PE2==0);
- delayms(20);
- if(falg==0)
- {
- falg=1;//直流步进标志
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
- }
- else
- { falg=0;
-
- }
- // PORTB_PB1=0;
- break;
- }
- PWM_Change_Duty(PWM0,100);
- PWM_Change_Duty(PWM1,100);
- DDRB=~data1[17-falg4];//指示灯
- bu1();
- delayms(kkk);
- bu2();
- delayms(kkk);
- bu3();
- delayms(kkk);
- bu4();
- delayms(kkk);
- bu5();
- delayms(kkk);
- bu6();
- delayms(kkk);
- bu7();
- delayms(kkk);
- bu8();
- delayms(kkk);
- //切换逆转
- if(PORTE_PE7==0)
- {
- while(PORTE_PE7==0);
- falg3=1;//步进状态标志
-
- delayms(20);
- break;
- }
- //切换停止
- if(PORTB_PB0==0)
- {
- while(PORTB_PB0==0);
- falg3=2;
- delayms(20);
- break;
-
- }
- }
- }
- //步进电机逆转
- else if(falg3==1)
- {
- for(i=0;i<200;i++)
- {
- if(PORTE_PE5==0)
- {
- while(PORTE_PE5==0);
-
- falg4++;
- if(falg4>17)
- {
- falg4=17;
- }
-
- delayms(20);
- break;
- }
- if(PORTE_PE3==0)
- {
-
- while(PORTE_PE3==0);
- falg4--;
- if(falg4==10)
- {
- falg4=11;
- }
- delayms(20);
- break;
- }
- if(PORTE_PE2==0)
- {
- while(PORTE_PE2==0);
- delayms(20);
- if(falg==0)
- {
- falg=1;
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
- }
- else
- { falg=0;
-
- }
- // PORTB_PB1=0;
- break;
- }
- PWM_Change_Duty(PWM0,100);
- PWM_Change_Duty(PWM1,100);
- DDRB=~data1[17-falg4];
- bu8();
- delayms(kkk);
- bu7();
- delayms(kkk);
- bu6();
- delayms(kkk);
- bu5();
- delayms(kkk);
- bu4();
- delayms(kkk);
- bu3();
- delayms(kkk);
- bu2();
- delayms(kkk);
- bu1();
- delayms(kkk);
- //切换顺转
- if(PORTE_PE6==0)
- {
- while(PORTE_PE6==0);
- falg3=0;
- delayms(20);
- break;
-
- }
- if(PORTB_PB0==0)
- {
- while(PORTB_PB0==0);
- falg3=2;
- delayms(20);
- break;
-
- }
-
- }
- }
- //停止步进电机
- else
- {
- if(PORTE_PE2==0)
- {
- while(PORTE_PE2==0);
- delayms(20);
- if(falg==0)
- {
- falg=1;
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
- }
- else
- { falg=0;
-
- }
-
- }
- if(PORTE_PE6==0)
- {
- while(PORTE_PE6==0);
- falg3=0;
- delayms(20);
-
- }
- if(PORTE_PE7==0)
- {
- while(PORTE_PE7==0);
- falg3=1;
- delayms(20);
- }
-
- PWM_Change_Duty(PWM0,0);
- PWM_Change_Duty(PWM1,0);
- }
- }
- void main(void)
- {
-
- unsigned char LedCnt=0;
- DDRB = 0x00;
- /* put your own code here */
- PLL_Init(PLL160);
- EnableInterrupts;
- PWM_Init(PWM0,100,100);
- PWM_Init(PWM1,100,100);
- PWM_Init(PWM2,100,100);
- PWM_Init(PWM3,100,0);
- PWM_Init(PWM4,100,100);
- PWM_Init(PWM5,100,0);
- while(1)
- {
- //下面直流和步进差不多
- if(PORTE_PE2==0)
- {
- while(PORTE_PE2==0);
- delayms(20);
- if(falg==0)
- {
- falg=1;
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
- }
- else
- { falg=0;
-
- }
- }
- if(falg==1)
- {
- if(PORTE_PE6==0)
- { ;
- while(PORTE_PE6==0);
- PWM_Change_Duty(PWM4,100);
- PWM_Change_Duty(PWM5,0);
-
- }
- if(PORTE_PE7==0)
- {
- while(PORTE_PE7==0);
- PWM_Change_Duty(PWM4,0);
- PWM_Change_Duty(PWM5,100);
-
- }
- if(PORTE_PE3==0)
- {
- while(PORTE_PE3==0);
- if(falg1==10)
- {falg1=3;
-
- }
- falg1++;
- if(falg1>7)
- {
- falg1=7;
- }
-
- }
- if(PORTE_PE5==0)
- {
-
- while(PORTE_PE5==0);
- if(falg1==10)
- {falg1=3;
-
- }
- falg1--;
- if(falg1==0)
- {
- falg1=1;
- }
-
- }
- if(falg1!=10)
- {
- PWM_Change_Duty(PWM1,35+falg1*2);
- DDRB=~data1[falg1-1];
- }
-
- if(PORTB_PB0==0)
- {
- PWM_Change_Duty(PWM1,0);
- falg1=10;
- while(PORTB_PB0==0);
-
- }
- delayms(20);
-
- }
- else
- {
- bu();
-
- }
- }
- }
复制代码
|
|