基于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;
}
|