msp430控制步进电机代码.docx
- 文档编号:20148851
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:16
- 大小:17.80KB
msp430控制步进电机代码.docx
《msp430控制步进电机代码.docx》由会员分享,可在线阅读,更多相关《msp430控制步进电机代码.docx(16页珍藏版)》请在冰豆网上搜索。
msp430控制步进电机代码
#include
#include
#include
//定义液晶显示笔画
#definea(0x01)
#defineb(0x02)
#definec(0x10)
#defined(0x08)
#definee(0x40)
#definef(0x20)
#defineg(0x04)
//#defineh(0x80)
//显示字符的指针
constunsignedcharLCD_Tab[]={
a+b+c+d+e+f,//显示"0",LCD_Tab[00]
b+c,//显示"1",LCD_Tab[01]
a+b+d+e+g,//显示"2",LCD_Tab[02]
a+b+c+d+g,//显示"3",LCD_Tab[03]
b+c+f+g,//显示"4",LCD_Tab[04]
a+c+d+f+g,//显示"5",LCD_Tab[05]
a+c+d+e+f+g,//显示"6",LCD_Tab[06]
a+b+c,//显示"7",LCD_Tab[07]
a+b+c+d+e+f+g,//显示"8",LCD_Tab[08]
a+b+c+d+f+g,//显示"9",LCD_Tab[09]
a+b+c+e+f+g,//显示"A",LCD_Tab[0A]
c+d+e+f+g,//显示"b",LCD_Tab[0B]
a+d+e+f,//显示"C",LCD_Tab[0C]
b+c+d+e+g,//显示"d",LCD_Tab[0D]
a+d+e+f+g,//显示"E",LCD_Tab[0E]
a+e+f+g,//显示"F",LCD_Tab[0F]
0,//显示"",LCD_Tab[10]
};
//步进电机步状态(4相8拍)
constunsignedcharSTEP_OUT[]={
0x10,//输出"00010000"
0x30,//输出"00110000"
0x20,//输出"00100000"
0x60,//输出"01100000"
0x40,//输出"01000000"
0xc0,//输出"11000000"
0x80,//输出"10000000"
0x90,//输出"10010000"
};
constunsignedcharSTEP_OUTT[]={
0x90,//输出"00010000"
0x80,//输出"00110000"
0xc0,//输出"00100000"
0x40,//输出"01100000"
0x60,//输出"01000000"
0xc0,//输出"11000000"
0x30,//输出"10000000"
0x10,//输出"10010000"
};
//定义时钟
struct{
unsignedcharYear;
unsignedcharMon;
unsignedcharDay;
unsignedcharHour;
unsignedcharMin;
unsignedcharSec;
}Clock;
unsignedintix;
unsignedcharx,p3,Step,key;
unsignedintresults;
doubledx;
intj=800,h,n=410;
//intp=200;
//v//oiddelay(unsignedinti)
//{/intj;
//for(i=0;i<1000;i++)
//{for(j=0;j<1000;j++)}
//};
voidmInitSTDIO()//系统初始化
{
unsignedchari;
//主时钟初始化
WDTCTL=WDTPW+WDTHOLD;//stopwatchdogtimer
FLL_CTL0|=XCAP14PF;//Configureloadcaps
//定时器A初始化
TACTL=TASSEL0+TACLR;//ACLK,clearTAR
TACCTL0=CCIE;//CCR0interruptenabled
TACCR0=32768;//定时器常数(1秒)
TACTL|=MC0;//StartTimer_ainupmode
//定时器B初始化
TBCTL=TASSEL0+TACLR;//ACLK,clearTAR
TBCCTL0=CCIE;//CCR0interruptenabled
TBCCR0=328;//定时器常数(1/100秒)
TBCTL|=MC0;
//P1口初始化
P1DIR=0;//设置P1.0~P1.7为输入方式
P1IFG=0;//清除P1的中断标志
P1IE=0xFF;//设置P1.0~P1.7中断
P1IES=0xFF;//设置P1.0~P1.7下降沿中断
//P2口初始化
P2DIR|=0xCF;//设置P2.0~P2.3,P2.6,P2.7为输出方式
//P3口初始化
P3DIR=0xFF;//设置P3.0~P3.7为输出方式
//P4口初始化
P4DIR|=0xFC;//设置P4.2~P4.7为输出方式
//P5口初始化
P5SEL=0xFF;//P5用于LCD显示
//P6口初始化
P6SEL=1;//P6.0用于ADC
P3DIR|=0xFE;//设置P6.1~P6.7为输出方式(临时)
//ADC12初始化
ADC12CTL0=ADC12ON+REFON+REF2_5V+SHT0_6;//打开ADC12,2.5V参考电压,设置SHT0=4*ADC12CLK*32
ADC12CTL1=SHS_0+SHP+CONSEQ_0;//SHS_0:
采样输入信号源选用ADC12SC
//SHP:
采样输入信号上升沿触发采样定时器,
//CONSEQ_0:
单通道单次模式,
ADC12MCTL0=INCH_8+SREF_1+EOS;//ref+=AVcc,channel=A3,endseq.
ADC12IE=0x01;//ADC12.0通道中断使能
ADC12CTL0|=ENC;//ADC12转换允许
//初始化LCD
LCDCTL=LCDON+LCD4MUX+LCDP0;//4-MuxLCD,segmentsS0-S15
BTCTL=BTFRFQ1;
for(i=0;i<8;i++)LCDMEM[i]=0;//清除显示
//串行口0(RS-485)初始化
UTCTL0=SSEL1;//UCLK=SMCLK
UBR00=0x6D;//1048576Hz/9600bps=109.2266=006Dh
UBR10=0x00;//1048576Hz9600bps
UMCTL0=0x03;//03modulation
UCTL0=CHAR;//8-bitcharacter*SWRST*
ME1|=UTXE0+URXE0;//EnableUSART0TXD/RXD
P2SEL|=0x30;//P2.4,P2.5用于串行口0(RS-232)
P2DIR|=0x10;//P2.4outputdirection
IE1|=URXIE0;//EnableUSART0RXinterrupt
//串行口1(RS-232)初始化
UTCTL1=SSEL1;//UCLK=SMCLK
UBR01=0x6D;//1048576Hz/9600bps=109.2266=006Dh
UBR11=0x00;//1048576Hz9600bps
UMCTL1=0x03;//03modulation
UCTL1=CHAR;//8-bitcharacter*SWRST*
ME2|=UTXE1+URXE1;//EnableUSART1TXD/RXD
P4SEL|=0x03;//P4.0,P4.1用于串行口1(RS-485)
P4DIR|=0x01;//P4.0,outputdirection
IE2|=URXIE1;//EnableUSART1RXinterrupt
}
intputchar(intchar_c)//通过串口输出监控信息
{
while((IFG2&UTXIFG1)==0);//USART0TXbufferready?
TXBUF1=char_c;//chartoTXBUF0
return(char_c);
}
voidDisplayInt(unsignedintData)//显示数据
{
unsignedcharx;
unsignedintdiv_val;
div_val=10000;
x=4;
do
{
LCDMEM[x]=LCD_Tab[Data/div_val];
x--;
Data%=div_val;
div_val/=10;
}while(div_val);
return;
}
voiddelay(intw)
{w=(w*10000)/32768;}
//主程序
main()
{
mInitSTDIO();//系统初始化
_EINT();//开启中断
for(dx=0;dx<1000;dx++);
printf("Start\n");
while
(1)
{
dx=dx*0.6857;
results=(unsignedint)dx;
DisplayInt(results);
switch(key)
{
case0x0:
TBCCR0=328-82*3;key=0x16;break;
case0x01:
TBCCR0=328-82*2;key=0x16;break;
case0x02:
TBCCR0=328-82*1;key=0x16;break;
case0x03:
TBCCR0=328;key=0x16;break;
case0x04:
TBCCR0=328+82*1;key=0x16;break;
case0x05:
TBCCR0=328+82*2;key=0x16;break;
case0x06:
TBCCR0=328+82*3;key=0x16;break;
case0x0a:
h=2;n=410/h;break;
case0x0b:
h=1;n=410*h;break;
case0x0c:
h=2;n=410*h;break;
case0x14:
TBCCTL0=CCIE;break;
case0x15:
TBCCTL0=0;break;
default:
break;
}
/*if(key==0x10)
{
TBCCR0=TBCCR0-82;
key=0x16;}
elseif(key==0x11)
{
TBCCR0=TBCCR0+82;
key=0x16;}
/*elseif(key==0x02)
{h=2;
TBCCR0=328+82*h;
}
elseif(key==0x03)
{h=3;
TBCCR0=328+82*h;
}
elseif(key==0x04)
{h=4;
TBCCR0=328+82*h;
}*/
/*elseif(key==0x0a)
{h=1;
n=200*h;
}
elseif(key==0x0b)
{h=2;
n=200*h;
}
elseif(key==0x0c)
{h=4;
n=200*h;
}
elseif(key==0x15)
{TBCCR0=0;
key=0x16;
}
elseif(key==0x14)
{TBCCR0=328;
key=0x16;
}
/*elseif(key==3)
{h=4;
n=200*h;
}
elseif(key==4)
{h=5;
n=200*h;
}*/
ADC12CTL0|=ADC12SC;//Startconversion
//_BIS_SR(LPM3_bits);//EnterLPM3
_BIS_SR(LPM0_bits);//EnterLPM0
}
}
//TimerA0中断服务程序
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A0(void)
{
p3<<=1;
if(p3==0)p3=1;
P3OUT=p3;
//_BIC_SR_IRQ(LPM3_bits);//ClearLPM3bitsfrom0(SR)
_BIC_SR_IRQ(LPM0_bits);//ClearLPM0,SETBREAKPOINTHERE
}
//TimerB0中断服务程序
#pragmavector=TIMERB0_VECTOR
__interruptvoidTimer_B0(void)
{
x<<=1;//键盘扫描
if((x&0x07)==0)x=1;
P2OUT=(~x)&0x07;
if(j>0)
{
Step++;//步进电机旋转
if(Step>7)Step=0;
P4OUT=STEP_OUT[Step];
j--;
}
if(j<=0)
{
Step++;//步进电机旋转
if(Step>7)Step=0;
P4OUT=STEP_OUT[7-Step];
j--;
if(j<-n){j=n;}
}
//if(k==0x13)
//Step++;//步进电机旋转
//if(Step>7)Step=0;
//P4OUT=STEP_OUT[7-Step];}
//_BIC_SR_IRQ(LPM3_bits);//ClearLPM3bitsfrom0(SR)
_BIC_SR_IRQ(LPM0_bits);//ClearLPM0,SETBREAKPOINTHERE
}
//ADC12中断服务程序
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
dx=(double)ADC12MEM0;//Moveresults,IFGiscleared
//_BIC_SR_IRQ(LPM3_bits);//ClearLPM3bitsfrom0(SR)
_BIC_SR_IRQ(LPM0_bits);//ClearLPM0,SETBREAKPOINTHERE
}
//P1中断服务程序
#pragmavector=PORT1_VECTOR
__interruptvoidP1INT(void)
{
unsignedintscan;
//unsignedcharkey;
scan=~P2IN;
scan&=0x0007;
scan<<=8;
scan|=P1IFG;
switch(scan)
{
case0x0101:
//"0"键键值
key=0x00;
break;
case0x0102:
//"1"键键值
key=0x01;
break;
case0x0104:
//"2"键键值
key=0x02;
break;
case0x0108:
//"3"键键值
key=0x03;
break;
case0x0110:
//"4"键键值
key=0x04;
break;
case0x0120:
//"5"键键值
key=0x05;
break;
case0x0140:
//"6"键键值
key=0x06;
break;
case0x0180:
//"7"键键值
key=7;
break;
case0x0201:
//"8"键键值
key=8;
break;
case0x0202:
//"9"键键值
key=9;
break;
case0x0204:
//"A"键键值
key=0x0a;
break;
case0x0208:
//"B"键键值
key=0x0b;
break;
case0x0210:
//"C"键键值
key=0x0c;
break;
case0x0220:
//"D"键键值
key=0x0d;
break;
case0x0240:
//"E"键键值
key=0x0e;
break;
case0x0280:
//"F"键键值
key=0x0f;
break;
case0x0401:
//"UP"键键值
key=0x10;
break;
case0x0402:
//"DN"键键值
key=0x11;
break;
case0x0404:
//"L"键键值
key=0x12;
break;
case0x0408:
//"R"键键值
key=0x13;
break;
case0x0410:
//"STRAT"键键值
key=0x14;
break;
case0x0420:
//"STOP"键键值
key=0x15;
break;
case0x0440:
//"ESC"键键值
key=0x16;
break;
case0x0480:
//"ENTER"键键值
key=0x17;
break;
default:
//其它情况
LCDMEM[6]=0;
break;
}
//delay(40);
if(key<0x10)LCDMEM[6]=LCD_Tab[key];
elseLCDMEM[6]=0;
P1IFG=0;
_BIC_SR_IRQ(LPM0_bits);//ClearLPM3bitsfrom0(SR)
}
//串行口0中断服务程序
#pragmavector=USART0RX_VECTOR
__interruptvoidusart0_rx(void)
{
}
//串行口1中断服务程序
#pragmavector=USART1RX_VECTOR
__interruptvoidusart1_rx(void)
{
putchar(RXBUF1);//将接收到的字符方送出去
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- msp430 控制 步进 电机 代码