标题:
基于MC9S12X128的直流电机与步进电机源代码
[打印本页]
作者:
cgdragon
时间:
2018-5-26 00:54
标题:
基于MC9S12X128的直流电机与步进电机源代码
基于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();
}
}
}
复制代码
main.docx
2018-5-26 00:55 上传
点击文件名下载附件
下载积分: 黑币 -5
15.22 KB, 下载次数: 5, 下载积分: 黑币 -5
作者:
admin
时间:
2018-5-26 02:26
需要补充原理图和完整源码才能获得100积分
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1