历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | 基于Energia的MPS430单片机编程

2019-10-16 来源:eefocus

在工程实践与科技创新课程中,单片机编程是一个很重要的环节。Energia作为一个简单易用的开发工具,易于上手,适合各个层次的开发者学习、使用。本文从一个从零基础开始学习的MSP-430单片机学习者角度讲述如何在此工具下针对本次工程实践与科技创新 IIB、IIIC及IV C 课题编程及应用。本方法适合有一定C或C++语言基础的单片机初学者学习使用。


Energia 集成开发环境简介


Energia是一个专为德州仪器公司MSP-430单片机开发的集成开发环境。


该软件在不同操作系统中有良好的兼容性,在Windows,Mac OS,Linux系统中均可使用。


该软件为免费软件,非常适合学习者使用。


该软件自带端口通讯模块,可与MSP-430单片机进行端口通讯。


软件下载


该软件为免费软件,可从官方网站 http://www.energia.nu 下载所需版 本,支持 Max OS X, windows 及 Linux 操作系统。


本教程中以 Mac OS X系统为例,故选择版本 


energia- 0101E0010-macosx.dmg 下载安装。


软件安装


打开下载的dmg文件,其中包含文件如下:


重启启动后,Energia程序已经安装在Application目录下,按下control键 同时双击该程序图标可以打开该程序。


将其中Energia文件拖拽入 Application文件夹 中。


按下control建,双击MSP430LPCD文件选择安装。 默认安装后,操作系 统会重新启动。


至此,msp430单片机所需的开发环境已经搭建完成,若安装后仍无法打 开,可能出于系统设置或系统版本原因,请参考:

http://energia.nu/Guide MacOSX.html 以下是软件截图: 


创建程序


首先学习创建第一个程序用来控制MSP430单片机上的LED灯 闪烁。


打开Energia软件,首先通过 Tools - Serial Port 选择使用的传输端口(通常只有一个选项,故为默认),在选择版面(board)类型。针对我们本次


所使用的MSP-EXP430G2单片机,我们选择


LaunchPad w/ msp430g2553 进 行操作。


所使用程序代码如下:


// the setup routine runs once when you press reset:

 

void setup() {

 

  // initialize the digital pin as an output.

 

  pinMode(RED_LED, OUTPUT);

 

}

 

// the loop routine runs over and over again forever:

 

void loop() {

 

  digitalWrite(RED_LED, HIGH);

 

   // turn the LED on (HIGH is the voltage level)

 

  delay(1000);

 

   // wait for a second

 

  digitalWrite(RED_LED, LOW);

 

   // turn the LED off by making the voltage LOW

 

  delay(1000);

 

   // wait for a second

 

}


程序说明:


1.该程序包含两端函数,分别用来做初始化设定(setup)和循环操作 (loop)。 


2.初始化时,选择红色LED灯用作信号输出。 


3.循环过程中,使用 digitalWrite(RED_LED,HIGH) 向红色LED灯提供高 电位,使其发光。使用delay函数做1000毫秒延时,使红色LED灯持续 发光1秒。使用 digitalWrite(RED LED,LOW) 命令将红色LED电位调 至低电位,从而LED灯熄灭。再做1000毫秒延时后完成循环。 


点击Verify 可以对该程序在计算机上编译、检查错误。编译通过后,点 击upload 可讲程序上传至单片机。参见下图:

运行程序后,可看到红色LED灯开始闪烁。实验成功。


类似的,通过对红色LED灯和绿色LED灯的间断控制,我们可以实现两 小灯泡组合闪烁的效果。


串口通信


Energia自带了串口通信工具,在与小车建立连接后,通过选择Tools - Serial Monitor 可建立与小车通讯。


在打开该串口工具前,需将含串口通讯的文件传入单片机中,并建立连接。本文以通过给单片机发送字符信号控制LED灯变换,过程如下:


代码:


char incomingByte = 'a';   // for incoming serial data

 

 

void setup() {

 

    Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps

 

    pinMode(RED_LED,OUTPUT);

 

    pinMode(GREEN_LED,OUTPUT);

 

    establishContact(); // send a byte to establish contact until receiver responds 

 

}

 

 

void loop() {

 

    

 

    // send data only when you receive data:

 

    if (Serial.available() > 0) {

 

        // read the incoming byte:

 

        incomingByte = Serial.read();

 

        if (incomingByte == 'a') {

 

            digitalWrite(RED_LED, HIGH);

 

        } else if (incomingByte == 'b'){

 

            digitalWrite(RED_LED,LOW);

 

        } else if (incomingByte == 'c'){

 

            digitalWrite(GREEN_LED,HIGH);

 

        } else if (incomingByte == 'd'){

 

            digitalWrite(GREEN_LED,LOW);

 

        }

 

    }

 

}


程序说明:


在setup中,通过 Serial.begin(9600) 函数打开串口,并将数据传输速率设置为9600bps。将LED_RED和LED_GREEN设置为输出端。Serial.available()将判断是否收到信息,当收到有信息接收时,返回值为1,否则为0。


Serial.read()能够从穿孔中读取信息,并将信息做为返回值返回。


运行:


上传并运行该程序后, 打开Tool - Serial Monitor 输入’a’可打开红的,输入’b’可关闭红灯,输入’c’可打开绿灯,输入’d’可关闭绿灯。


另外,通过Serial.println(string str);可输出括号中的字符串,注意若要直接输出,需将内容写在双引号,如Serial.println(“Hello World”);


关于更多串口通讯的函数可参见附录A。


数据读取


在与单片机通讯时,难免会遇到需要收发数据的情况,默认传输为char(8位)若要传输int或float等数据类型需要对数据进行处理后才能收发【2】。此处介绍将数据转换为字符串后通过字符串传输的方式收发数据。参考Energia中例程 File - Examples - 6.Strings - StringToInt。


代码:


String inString = "";    // string to hold input

 

 

 

void setup() {

 

  // Initialize serial communications:

 

  Serial.begin(9600);

 

}

 


void loop() {

 

  // Read serial input:

 

  while (Serial.available() > 0) {

 

    int inChar = Serial.read();

 

    if (isDigit(inChar)) {

 

      // convert the incoming byte to a char 

 

      // and add it to the string:

 

      inString += (char)inChar; 

 

    }

 

    // if you get a newline, print the string,

 

    // then the string's value:

 

    if (inChar == 'n') {

 

      Serial.print("Value:");

 

      Serial.println(inString.toInt());

 

      Serial.print("String: ");

 

      Serial.println(inString);

 

      // clear the string for new input:

 

      inString = ""; 

 

    }

 

  }

 

}


程序说明:


此程序可以将读入的String类型数据转换为整型数。


从串行端口读入字符串,直至读到换行符时停止。然后通过String类中的toInt函数将该字符串转换为int变量。


程序中,isDigit(char a)函数可以用来判断字符a是否指代数字(0~9)。


将该程序上传至单片机,通过Energia所带的串口通信模块,可以与向其发送数字,之后会返回用数字和字符串表示的所发送数据。


MSP430单片机   

图1 MSP430单片机示意图


如图所示,两黄色框内数字及名称为端口表,在Energia编程时可直接当做已声明变量调用。其中端口3、4号端口为通信端与蓝牙模块的收发端相接。


注意在连接时单片机TXD应于蓝牙RXD端口相连,单片机RXD应与蓝牙TXD端口相连。跳帽应按照图中白色方框所示安置。


应用Energia为走迷宫小车编程


舵机的控制

普通舵机需要使用PWM信号进行控制,简单来说,控制该舵机需要向舵机发送一定周期个固定频率(50Hz左右)的信号,并且,该信号需要有一个较为固定的占空比(duty cycle)(7.5%左右)【3】。详细原理可参见参考文献中中连接,在此不以赘述。


在Energia中,可以使用 delayMicroseconds(int a) 和 delay(int a)函数来记录时间延迟,前者单位为微秒,即为1/1000 000秒,可以在a≤16383时精确延迟a个单位。注意,此处a的值一定不能大于16383,若要精确延迟大于16383个单位时,可以多次使用delayMicroseconds(int a)来实现。


delay(int a)函数延迟单位为毫秒,即为1/1000秒。


若要想舵机发送50Hz信号,则信号周期为20ms,高电位信号约为1.5ms,为了提高精确度,此处统一使用delayMicroseconds函数。


代码:


void steer(){

 

    int tmp = duty;

 

    for (int i=0; i 

        digitalWrite(STEER,LOW);

 

        delayMicroseconds(tmp);

 

        digitalWrite(STEER,HIGH);

 

        delayMicroseconds(10000-tmp);

 

        delayMicroseconds(6550);

 

    }    

 

}



程序说明:


由于电路连接原因,从STEER端口发送低信号时,舵机可接受到高位信号。具体运行时,需要对全局标量duty值进行反复调试,通过改变duty及延迟值,得到正方向时全局变量duty对应值。我们的实验中,duty约为1230时可以调节至正方向。


另外,由于额外的预算也会导致时间的延迟,在循环过程中应尽量避免数学运算。


*要达到合适转动角度需进行多次调试,直到达到理想转角。


除使用计时函数delay来控制时间延迟外,Energia中还提供了时间读取函数,可以从单片机中读取时间来提高计时的精准度,并可避免其他运算带来的时间延误。所需函数及代码见附录A。


1. 电机控制


电机控制原理较为简单,当给电机一端以高电位信号时,电机开始转动,两端电位相同时,电机静止。


为了调节电机转速,可以使用向电机发送周期信号的方式调节。在Energia中提供了analogWrite函数,可以发出固定占空比的频率约为490Hz的模拟信号,具体使用方法见附录A。使用该函数,通过改变发出信号的占空比,可以改变电机转速。但由于点击硬件限制,速度可调范围十分有限,在此不建议大家大幅调整,若占空比过低时可能出现点击停转现象。


2. 收发信号


在已有小车上已安装蓝牙模块,可通过蓝牙与计算机进行串口通讯。通讯办法与USB串口通讯相同,若要改变收发信号端口或是增加收发端口,可以通过引入新库来实现。选择Sketch - import Library选择所需新的库,如若要增加通信端口,可以选择SoftwareSerial增加。


3. 整体实现


IIB 代码:


#define LEFT_AHEAD 10

 

//根据点击链接而定,对应管脚参见MSP430示意图

 

#define LEFT_BACK 9

 

#define RIGHT_AHEAD 13

 

#define RIGHT_BACK 12

 

#define STEER 14

 

int duty = 1230;

 

String inString="";

 

float RunInit = 3.0;

 

float RUN_LEFT = 3.0;

 

float RUN_RIGHT = 3.0;

 

 

 

int TURN = 60;

 

int RUN1 = 255;

 

int CYC = 5;

 

float calibrateNum = 0;

 

void stopBack();

 

void turnLeft();

 

void turnRight();

 

void goAhead();

 

void park();

 

void goBack();

 

 

 

void setup(){

 

    Serial.begin(9600);

 

    pinMode(LEFT_AHEAD,OUTPUT);

 

    pinMode(LEFT_BACK, OUTPUT);

 

    pinMode(RIGHT_AHEAD, OUTPUT);

 

    pinMode(RIGHT_BACK, OUTPUT);

 

    digitalWrite(LEFT_AHEAD, LOW);

 

    digitalWrite(LEFT_BACK, LOW);

 

    digitalWrite(RIGHT_AHEAD, LOW);

 

    digitalWrite(RIGHT_BACK, LOW);;

 

    

 

    pinMode(STEER, OUTPUT);

 

    digitalWrite(STEER, LOW);

 

    

 

    for (int i=0; i<100; i++) {

 

        

 

        digitalWrite(STEER,LOW);

 

        delayMicroseconds(duty);

 

        digitalWrite(STEER,HIGH);

 

        delayMicroseconds(10000-duty);

 

        delayMicroseconds(6550);

 

        

 

    }

 

 

 

}

 

 

 

char incomingByte = ' ';

 

 

 

void loop(){

 

    if (Serial.available() > 0) {

 

        // read the incoming byte:

 

        incomingByte = Serial.read();

 

        if (incomingByte == 'L') {

 

            Serial.println("TURN LEFT");

 

            turnLeft();

 

            Serial.read();

 

        } else if (incomingByte == 'R'){

 

            Serial.println("TURN RIGHT");

 

            turnRight();

 

            Serial.read();

 

        } else if (incomingByte == 'A'){

 

            Serial.println("GO AHEAD");

 

            goAhead();

 

            Serial.read();

 

        } else if (incomingByte == 'B'){

 

            Serial.println("GO BACK");

 

            goBack();

 

            Serial.read();

 

        } else if (incomingByte == 'P'){

推荐阅读

史海拾趣

Alpha Semiconductor公司的发展小趣事

随着技术的不断积累和市场的变化,Alpha Semiconductor于1988年开始为OEM厂家设计定制产品。这一转型是公司发展历程中的重要一步,它使得Alpha Semiconductor能够更深入地了解客户需求,提供更加贴合市场需求的产品解决方案。通过不断的创新和改进,Alpha Semiconductor逐渐在半导体市场中树立了良好的口碑。

Fujisoku Corporation公司的发展小趣事

随着全球化进程的加速,“未来电子”意识到单一市场已无法满足公司的长远发展需求。于是,公司制定了全球化战略,通过设立海外研发中心、生产基地和销售网络,积极拓展国际市场。在欧洲、北美和亚洲等地,“未来电子”的产品和服务得到了广泛认可,市场份额逐年攀升。这一战略不仅提升了公司的国际影响力,还为公司的持续增长提供了强劲动力。

乾坤(Cyntec)公司的发展小趣事

产品质量是企业的生命线。乾坤公司深谙此道,因此在发展过程中始终注重质量管理体系的建立和完善。公司引进了国际先进的质量管理理念和方法,通过ISO 9001质量管理体系认证,并严格执行每一道生产工序的质量控制。为了确保产品质量的稳定性和可靠性,乾坤还建立了完善的产品测试和验证流程,每一批产品都要经过严格的质量检测才能出厂。这些举措不仅提升了产品质量,也赢得了客户的广泛认可和信赖。

Floeth Electronic Ltd公司的发展小趣事

随着科技的不断进步,电子行业的发展日新月异。乾坤公司意识到,要想保持领先地位,就必须不断进行技术创新。于是,公司加大了对研发团队的投入,引进了一批高水平的科研人才,并与多所高校和研究机构建立了紧密的合作关系。在一次偶然的实验中,研发团队发现了一种新型材料,可以显著提升电子元器件的性能。经过一系列严格的测试和验证,这种新材料被成功应用于产品生产中,使得乾坤的电子元器件在性能上实现了质的飞跃。这一技术创新不仅为公司带来了丰厚的利润,更让乾坤在电子行业中声名鹊起。

上海国芯(Gcore)公司的发展小趣事
首先检查电源电压是否正常,电源是否稳定。
AXTAL公司的发展小趣事

自成立以来,AXTAL公司一直致力于提升产品的技术和品质。公司凭借完善的质量管理体系(QMS)确保产品的高质量和可靠性。在产品设计阶段,AXTAL应用了受控设计流程,并在客户应用程序中进行了大量验证步骤和最终验证。同时,公司还拥有记录良好的制造流程过程控制系统,通过大量的在线测试、检查和筛选,确保每一件产品都符合高标准的质量要求。

问答坊 | AI 解惑

交流变为直流的稳压电源

在输入电压220V、50Hz、电压变化范围+15%~-15%条件下; a、 输出电压可调范围:+3V~+15V; b、 最大输出电流:2A; c、 电压调整率≤0.2%(输入电压变化范围+15%~-15%下,满载); d、 负载调整率≤1% e、 纹波电压(峰- ...…

查看全部问答>

15075018luerdu(程序一)

这个程序的作用是 ;把V/F转换得到的脉冲送到单片机的T0口计数, ;计数的结果放到R2,R3中 ;求出计数值的万,千,百,十,个位,然后分别放在74H,73H,72H,71H,70H中 ;最后把结果通过4094串行移位寄存器显示出来 ORG 0000H LJM ...…

查看全部问答>

单片机8051缓存显示

功能:把键盘输入的数据存入显示缓存区 displaybuf ,然后显示缓存区的内容, 调试的结果不对,显示很乱~ 不知道什么原因? #include #define uchar unsigned char #define uint unsigned int sbit ledk=P2^5;  //锁存口 sbit d ...…

查看全部问答>

WinCE系统下如何识别以太网,U盘,USB电缆的状态

WinCE系统下如何识别  以太网网口的状态---即有没有与其他电脑相连接 WinCE系统下如何识别  U盘的状态----是否有U盘插到usb host口上 WinCE系统下如何识别  USB电缆的状态----是否有USB电缆连接到USB device上…

查看全部问答>

寻AT91RM9200的VxWorksBSP!

我在www.pudn.com下载的AT91RM9200(DKEK)VxWorksBSP.RAR,但下载下来才知道只是一份开发者指南,不是源码。我现在准备上AT91RM9200,也准备买一块评估板,但都没有VxWorks的BSP,大家能送我一份吗?我们可以交换源码的。 谢谢! …

查看全部问答>

哪款传感器适合红外体温计

各位大虾们,我毕业设计的题目是要求做红外体温计,不知道用哪款传感器比较好点,希望大家能给点帮助,谢谢啦!…

查看全部问答>

10种软件滤波方法

1、限幅滤波法(又称程序判断滤波法)     A、方法:         根据经验判断,确定两次采样允许的最大偏差值(设为A)         每次检测到新值时判断: ...…

查看全部问答>

altium

altium 中的DXP是啥的缩写…

查看全部问答>

msp430写ds18b20读取错误

能够初始化ds18b20,但读取怎么都不正确!!…

查看全部问答>

电子密码锁设计及论文

电子密码锁设计及论文…

查看全部问答>