1204|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP430直流电机控制 [复制链接]

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

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表