MSP430直流电机控制

xiaoxiao2021-02-28  138

基于MSP430的直流电机控制,直流电机可以启动/停止,正反转,加减速。加减速使用PWM进行控制。 所有程序如下: /* 引脚连接:IN1-P1.5 IN2-P1.7 ENA-P1.2 key1-P2.0 key2-P2.1 key3-P2.2 key4-P2.5 key5-P2.4 */ #include "msp430.h" #define uint unsigned int #define uchar unsigned char #define key1 0x01 #define key2 0x02 #define key3 0x03 #define key4 0x04 void key_process_1(); void key_process_2(); void key_process_3(); void key_process_4(); void key_check(); void Init_PWM(); uchar key_value; //定义全局变量,键值 uint a = 10000; //初值50%占空比 void main() { WDTCTL = WDTPW + WDTHOLD; Init_PWM(); P2IE = 0x37; //P2.0~P2.3 中断使能 P2IES = 0x37; //P2.0~P2.3 下降沿触发中断 P2IFG = 0x0; //P2.0~P2.2 中断标志位清除 _EINT(); //中断允许 while(1){ //正反转按键按下 if(P2IN & BIT4){ P1OUT &= ~(BIT4 + BIT7); //正转 P1OUT |= BIT0 + BIT5; } else{ P1OUT &= ~(BIT0 + BIT5); //反转 P1OUT |= BIT4 + BIT7; } CCR1 = a; key_check(); switch(key_value){ //对键值进行处理 case key1:key_process_1(); break; case key2:key_process_2(); break; case key3:key_process_3(); break; case key4:key_process_4(); break; default:break; } key_value = 0x00; //键值清除 P2IE = 0x37; //P2.0~P2.3 中断使能 P2IFG = 0x0; //P2.0~P2.2 中断标志位清除 } } #pragma vector=PORT2_VECTOR __interrupt void Port_2() //P2中断服务程序 { switch(P2IFG){ //对键值进行处理 case 0x01:key_value = 0x01; break; case 0x02:key_value = 0x02; break; case 0x04:key_value = 0x03; break; case 0x20:key_value = 0x04; break; default:P2IFG = 0x0; break; } P2IFG = 0x0; } void key_check() { uint i; for(i = 0;i < 200;i++); //延时去抖动 if(0xff != (P2IN & 0xd8)){ //是否有键存在 while(0xff != (P2IN | 0xd8)); //一直等待按键松开 } else key_value = 0x00; //延时去抖动无键按下,则清除键变量 } void Init_PWM() { BCSCTL2 |= SELS ; //SMCLK = XT2 BCSCTL2 = DIVS0 + DIVS1; P1DIR = 0xff; // P1输出 P1OUT &= ~BIT2; CCR0 = 20000; // PWM 周期 CCTL1 = OUTMOD_7; // CCR1复位/置位 CCR1 = a; // CCR1 PWM 占空比50% TACTL = TASSEL_2 + MC_1; // 定时器A时钟源为SMCLK,增计数模式 } void key_process_1() //启动 { P1SEL |= 0x04; //P1.2第二功能 TA1 输出PWM TACTL= TASSEL_2 + MC_1; //定时器A时钟源为SMCLK,增计数模式 } void key_process_2() //停止 { P1SEL = 0x0; //P1.2第二功能 TA1 输出PWM TACTL= MC_0; P1OUT &= ~BIT2; } void key_process_3() //加速 { a += 1000; if(a >= 20000) a = 20000; } void key_process_4() //减速 { a -= 1000; if(a <= 0) a = 0; }

proteus仿真图如下:

转载请注明原文地址: https://www.6miu.com/read-29974.html

最新回复(0)