msp430单片机控制步进电机实验的电路图及C程序.doc_第1页
msp430单片机控制步进电机实验的电路图及C程序.doc_第2页
msp430单片机控制步进电机实验的电路图及C程序.doc_第3页
msp430单片机控制步进电机实验的电路图及C程序.doc_第4页
msp430单片机控制步进电机实验的电路图及C程序.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

各模块的电路图如下:试验程序如下:#include #define DCO_FREQ 1000000 / DCO frequency#define ONE_SEC_CNT 512 / Number of WDT interrupts in 1 second#define DEBOUNCE_CNT 0x05 / (1/512)*5 = 10 msec debounce#define DIR_MASK 0x01 / 0x01 is clockwise, 0x00 is counter-clockwise#define STEP_MASK 0x02 / 0x00 is full-stepping, 0x02 is half-stepping#define MOTION_MASK 0x04 / 0x00 is continuous, 0x04 is single-step#define DEFAULT_RATE 0x8000 / Default stepping rate#define MIN_RATE 0x8000 / Minimum stepping rate#define MAX_RATE 0x0800 / Maximum stepping rate/ Default state is full-stepping, clockwise, continuousunsigned char state = 1; / State variableunsigned char stepIndex = 0; / State table indexunsigned int rate = DEFAULT_RATE; / Stepping rateunsigned char change_rate_flag = 0; / Flag indicating rate changeunsigned int max_rate = MAX_RATE; / Maximum stepping rateunsigned int min_rate = MIN_RATE; / Minimum stepping rateunsigned int SW4; void sys_init(void);void Set_DCO(unsigned long freq);void timerA_Init(void);void uart0_Init(void);void wdt_Init(void);void toggle_stepping_mode(void);void increase_stepping_rate(void);void decrease_stepping_rate(void);void toggle_motion(void);void toggle_direction(void);/定义串口操作变量char nRev_UART0;/ 串口 0 的接收标志char UART0_TX_BUF10;/ 串口 0 的发送缓冲区char UART1_RX_Temp10;char UART0_RX_BUF10;/ 串口 0 的接收缓冲区int nTX0_Len;int nRX0_Len;int nRX0_Len_temp;char nTX0_Flag;int nSend_TX0;/ 整步状态表Astatic const unsigned char fullStepA =0x00,0x00,0x01,0x01;/ 半步状态表Bstatic const unsigned char fullStepB =0x01,0x00,0x00,0x01;/ 半步状态表Astatic const unsigned char HalfStepA =0x01, / 001 10x06, / 110 20x00, / 000 30x00, / 000 40x00, / 000 50x07, / 111 60x01, / 001 70x01 / 001 8;/ 逆时钟、半步状态表Bstatic const unsigned char CcwHalfStepB =0x01, / 001 10x01, / 001 20x01, / 001 30x06, / 110 40x00, / 000 50x00, / 000 60x00, / 000 70x07 / 111 8;/ 顺时钟、半步状态表Bstatic const unsigned char CwHalfStepB =0x00, / 000 10x00, / 000 20x00, / 000 30x07, / 111 40x01, / 001 50x01, / 001 60x01, / 001 70x06 / 110 8;void main(void)int i;/ 停止WDTWDTCTL = WDTPW + WDTHOLD;sys_init();_EINT();for(;)if(nRev_UART0 = 1) nRev_UART0 = 0;for(i = 0;i numDcoClks )DCOCTL-;if( DCOCTL = 0xFF )if( BCSCTL1 & 0x07 )BCSCTL1-;elsebreak;elseDCOCTL+;if( DCOCTL = 0x00 )if( (BCSCTL1 & 0x07) != 0x07 )BCSCTL1+; elsebreak;/ ACLK = LFXT1CLK/1 = 32768 HzBCSCTL1 &= DIVA_3; TACCTL2 = 0; TACTL = 0;void wdt_Init(void)/ 设置时钟源为ACLK,1秒内产生512此WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL + WDTIS0 + WDTIS1;void uart0_Init(void) /将寄存器的内容清零 U0CTL = 0X00;/数据位为8bit U0CTL += CHAR; U0TCTL = 0X00;/波特率发生器选择ACLK U0TCTL += SSEL0; /波特率为9600 UBR0_0 = 0X03; UBR1_0 = 0X00; UMCTL_0 = 0x4A; /使能UART0的TXD和RXD ME1 |= UTXE0 + URXE0; /使能UART0的RX中断 IE1 |= URXIE0;/使能UART0的TX中断 IE1 |= UTXIE0; /设置P3.4为UART0的TXD P3SEL |= BIT4;/设置P3.5为UART0的RXD P3SEL |= BIT5; /P3.4为输出管脚 P3DIR |= BIT4;void timerA_Init(void)TACCR0 = rate;TACCTL0 = CCIE;TACTL = TASSEL_2 + MC_1 + TACLR;interrupt TIMERA0_VECTOR void TimerA_ISR(void)unsigned char index;unsigned char p2 = 0;unsigned char p3 = 0;/ 判断步进速率是否需要改变if( change_rate_flag )TACCR0 = rate;change_rate_flag = 0;/ 判断状态switch( (state & 0x3) )case 0x00: / 整步、逆时钟方向index = stepIndex & 0x03;p2 |= fullStepAindex;p3 |= fullStepBindex;P2OUT = p2;P3OUT = p3;+stepIndex;break;case 0x01: / 整步、顺时钟方向index = stepIndex & 0x03;p3 |= fullStepAindex;p2 |= fullStepBindex;P3OUT = p3;P2OUT = p2;+stepIndex;break;case 0x02: / 半步、逆时钟方向index = stepIndex & 0x07;p2 |= HalfStepAindex;p3 |= CcwHalfStepBindex;P2OUT = p2;P3OUT = p3;+stepIndex;break;case 0x03: / 半步、顺时钟方向index = stepIndex & 0x07;p3 |= CwHalfStepBindex;p2 |= HalfStepAindex;P3OUT = p3;P2OUT = p2;+stepIndex;break;default: break;/ 如果单步状态下,禁止定时器中断if( state & MOTION_MASK )TACCTL0 &= CCIE;/ 处理来自串口 0 的接收中断interrupt UART0RX_VECTOR void UART0_RX_ISR(void)/接收来自的数据 UART0_RX_BUFnRX0_Len_temp = RXBUF0; nRX0_Len_temp += 1; if(nRX0_Len_temp = 2) if(UART0_RX_BUFnRX0_Len_temp - 2 = r & UART0_RX_BUFnRX0_Len_temp - 1 = n) / 过滤掉回车换行(rn) if(nRX0_Len_temp = 2) nRX0_Len_temp = 0; else if(nRX0_Len_temp 2) nRX0_Len = nRX0_Len_temp; nRev_UART0 = 1; nRX0_Len_temp = 0; / 处理来自串口 0 的发送中断interrupt UART0TX_VECTOR void UART0_TX_ISR(void) if(nTX0_Len != 0) / 表示缓冲区里的数据没有发送完 nTX0_Flag = 0; TXBUF0 = UART0_TX_BUFnSend_TX0; nSend_TX0 += 1; if(nSend_TX0 = nTX0_Len) nSend_TX0 = 0; nTX0_Len = 0; nTX0_Flag = 1; interrupt WDT_VECTOR void WDT_ISR(void)unsigned char sw_state;static unsigned char one_sec_flag = 0;/ 获得P1口的输入sw_state = P1IN & 0x0f;/ 判断是否有键按下if( sw_state = 0x00 )/ 禁止看门狗中断IE1 &= WDTIE;/ 判断是否S2的激活状态小于1秒if( !one_sec_flag & (SW1 = DEBOUNCE_CNT) )toggle_motion();/ 复位状态计数器SW0 = 0;SW1 = 0;SW2 = 0;SW3 = 0;/ 复位标志one_sec_flag = 0;/ 使能P1口的中断功能P1IFG = 0x00;P1IE = 0x0f;else/ 检查是否是S1状态if( sw_state & 0x01 )if( SW0 ONE_SEC_CNT )/ 增加状态计数器+SW0;if( SW0 = DEBOUNCE_CNT )toggle_direction();elseSW0 = 0;/ 检查是否是S2状态if( sw_state & 0x02 )if( SW1 = DEBOUNCE_CNT) )toggle_motion();one_sec_flag = 0;SW1 = 0;/ 检查是否是S3状态if( sw_state & 0x04 )/ 检查是否是连续模式if( (state & MOTION_MASK) = 0 )if( SW2 ONE_SEC_CNT )/ 增加状态计数器+SW2;if( SW2 = DEBOUNCE_CNT )increase_stepping_rate();else / 单步模式/ 增加状态计数器+SW2;if( (SW2 % DEBOUNCE_CNT) = 0 )increase_stepping_rate();else SW2 = 0;/ 检查是否是S4状态if( sw_state & 0x08 )if( SW3 1;if( new_rate = max_rate )rate = new_rate;change_rate_flag = 1;/使能定时器A的中断TACCTL0 |= CCIE;void decrease_stepping_rate(void)/ 检查是否是连续模式if( (state & MOTION_MASK) = 0 )if( rate 1) )rate 1);change_rate_flag = 1;max_rate = (MAX_RATE 1);min_rate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论