资料介绍
描述
介绍
对于熟悉 Arduino IDE 的digitalRead()和digitalWrite()的人来说,德州仪器的 Code Composer Studio 的端口方向和按位操作可能看起来有点陌生。但是请相信我,一旦您习惯了它,您将立即使用 PIC 和 MSP430 等廉价 MCU 制作史诗般的项目!
我们将使用MSP430 G2553 超值系列 MCU 随附的MSP430G2 LaunchPad 开发套件( http://www.ti.com/tool/MSP-EXP430G2)制作带有 PD 控制器的线路跟随机器人。如果您有不同的德州仪器 MCU,代码应该可以工作,但您必须检查其数据表以确保引脚支持分配给它们的某些特殊功能。(如定时器和中断)
代码编写器工作室
安装时,请确保您正在安装 MSP430 设备的所有组件。安装完成后,打开应用程序并使用 File > New创建一个新的CCS 项目。
确保选择正确的目标设备。您可以在插入电路板后使用识别按钮让 CCS 找出电路板。为您的项目命名并点击完成。
您将看到一个包含如上所示小代码片段的 main.c 文件。主循环内的乱码用于停止看门狗计时器(呃!它旁边的评论中这么说)提示:尝试突出显示该行的一个单词并按 F3。它将在单独的文件中打开 msp430g2553.h 文件,并为您提供有关该寄存器的更多信息。
设置和清除位
我们将使用 DIR 寄存器作为如何设置和清除位的示例。
MSP430 使用 DIR(方向)寄存器将引脚设置为输入或输出。此外,G2553 有两个端口,分别是 PORT1 和 2。看看你的 Launchpad。您会看到标记为 P1.0、P1.1、P2.0、P2.1 的引脚。他们的意思是什么?简单!P1.0 - 端口 1,引脚 0P2.3 - 端口 2,引脚 3
这些端口通常为 8 位长,这就是为什么每个端口只能看到 8 个引脚的原因。两个端口有两个 DIR 寄存器,它们遵循与引脚相同的命名约定。P1DIR - 端口 1 方向寄存器 P2DIR - 端口 2 方向寄存器
这些寄存器也是 8 位长,每个位对应于相关端口中的一个引脚。P1DIR的BIT1对应P1.1(Port 1 Pin 1)
正确的。那么我们如何将一个引脚设置为输入或输出呢?如果将 DIR 寄存器中某个引脚的相应位设置为 1,则该引脚为输出。同样,如果您将该位设置为 0,则该引脚将成为输入。与 Arduino 的 pinMode() 函数相同。例如 - 为了将 P2.1 设置为输出,我们必须将 P2DIR 的 BIT1 设为 1。CCS 允许我们通过使用 BIT0、BIT1、BIT2 轻松访问寄存器中的位。 ..BIT6 关键字。
尝试在 CCS 中输入“ BIT4 ”,突出显示它并按 F3 键。您将能够看到它们是如何在 msp430g2553.h 标头中定义的。
您可以使用这些关键字和二进制 OR 运算符 ('|') 将寄存器中的各个位设置为 1。
P1DIR |= BIT2; //Set BIT2 of P1DIR to 1 (Sets pin 1.2 as an output)
我们正在使用 or 运算符,以便我们只对所需的位进行更改。
重置一个位是棘手的。这涉及使用二进制 AND 运算符 (' & ') 和二进制补码运算符 (' ~ ')
P1DIR &= ~BIT2; //Set BIT2 of P1DIR to 0 (Sets pin 1.2 as an input)
接线组件
现在我们知道了基础知识,让我们开始做生意。首先,使用下面的图片作为组装组件的指南。(我还附上了fritzing项目,你可以在本页底部下载)
注意:我使用了 TCRT5000 和比较器附带的 IR 线跟随传感器。这些东西相当便宜。你可以花 2 美元买到其中的 5 个。epid=911730611&hash=item488ae89f86:g:TDUAAOSwlzZbIiiiI:rk:3: pf:0
声明和全局变量
我们将首先声明我们将使用的函数和全局变量的名称。
#include
void MotorSetup();
void SetLeftMotorSpeed();
void SetRightMotorSpeed();
void SetSpeeds(int lspeed,int rspeed);
void IRSensorSetup();
void SonarSetup();
void ReadSonar();
int readLine();
void lineFollow();
void SetBrakes();
/**
* main.c
*/
unsigned int up_counter;
unsigned int distance_cm;
int val = 0;
int sensorpanelVal = 0;
int lastval = 0;
//PID Values
int error = 0;
int lasterror = 0;
#define BaseSpeed 160
#define Kp 18
#define Kd 30
引脚设置
让我们首先设置引脚以使用我们的声纳。我正在使用单独的函数,我将在主函数中调用一次。
void SonarSetup(){
/* set P1.2 (TRIG)to output direction */
P1DIR |= BIT2;
P1OUT &= ~BIT2; // keep trigger at low
/* Set P1.1 to input direction (echo)
P1.1 is an input for Timer A0 - Compare/Capture input */
P1DIR &= ~BIT1;
// Select P1.1 as timer trigger input select (echo from sensor)
P1SEL = BIT1;
/* Timer A0 configure to read echo signal:
Timer A Capture/Compare Control 0 =>
capture mode: 1 - both edges +
capture sychronize +
capture input select 0 => P1.1 (CCI1A) +
capture mode +
capture compare interrupt enable */
CCTL0 |= CM_3 + SCS + CCIS_0 + CAP + CCIE;
/* Timer A Control configuration =>
Timer A clock source select: 1 - SMClock +
Timer A mode control: 2 - Continous up +
Timer A clock input divider 0 - No divider */
TA0CTL |= TASSEL_2 + MC_2 + ID_0;
// Global Interrupt Enable
_BIS_SR(GIE);
}
如果您想了解有关所用寄存器的更多信息,可以在此处查看 MSP430 G2553 数据表。
现在让我们设置控制 L298N 电机驱动器所需的引脚。
void MotorSetup(){
P2DIR |= BIT1+BIT5;//Pin 2.1 -> left motor speed Pin 2.5 -> Right Motor Speed
P2SEL |= BIT1+BIT5;
P1DIR |= BIT3+BIT4; // Set Pins 1.3 and 1.4 as outputs to control left motor direction
P1DIR |= BIT5+BIT0; // Set Pins 1.5 and 1.6 as outputs to control right motor direction
P1OUT &= ~(BIT1+BIT4+BIT5+BIT0); //set all pins to low
/*** Timer1_A Set-Up ***/
TA1CCR0 |= 200 - 1;
TA1CCTL1 |= OUTMOD_7;
TA1CCTL2 |= OUTMOD_7;
TA1CCR1 |= 0;
TA1CCR2 |= 0;
TA1CTL |= TASSEL_2 + MC_1;
}
最后,读取 5 个红外传感器的引脚。
void IRSensorSetup(){
//Set IR sensor pins as inputs
P2DIR &= ~(BIT0+BIT2+BIT3+BIT4); //Set pins 2.0,2.2,2.3,2.4 as inputs
P1DIR &= ~(BIT6); //1.7 as inputs
}
辅助函数
让我们创建一些帮助函数,使我们能够轻松地控制我们的组件。这比把所有东西都塞进 main 函数要容易得多。
读取声纳的辅助功能 -
void ReadSonar(){
P1OUT ^= BIT2; // assert
__delay_cycles(10); // 10us wide
P1OUT ^= BIT2; // deassert
__delay_cycles(60000); // 60ms measurement cycle
}
控制电机的功能 -
void SetLeftMotorSpeed(int speed){
if (speed >0){
P1OUT &= ~BIT3; // Pin 1.3 Low
P1OUT |= BIT4; //Pin 1.4 High
if(speed >199){
speed = 199;//prevent CCR2 from being negative
}
TA1CCR1 = speed;
}else if(speed <0){
P1OUT |= BIT3; //1.3 High
P1OUT &= ~BIT4; // Pin 1.4 Low
speed = -speed;
if(speed >199){
speed = 199;//prevent CCR1 from being negative
}
TA1CCR1 = speed;
}
}
void SetRightMotorSpeed(int speed){
if (speed >0){
P1OUT &= ~BIT5;//Pin 1.5 Low
P1OUT |= BIT0; // Pin 1.3 Low
if(speed >199){
speed = 199;//prevent CCR2 from being negative
}
TA1CCR2 = speed;
}else if(speed <0){
P1OUT |= BIT0; //1.5 High
P1OUT &= ~BIT6;//Pin 1.6 Low
speed = -speed;
if(speed >199){
speed = 199; //prevent CCR2 from being negative
}
TA1CCR2 = speed;
}
}
void SetSpeeds(int lspeed,int rspeed){
SetLeftMotorSpeed(lspeed);SetRightMotorSpeed(rspeed);
}
void SetBrakes(){
P1OUT &= ~BIT5;//Pin 1.5 Low
P1OUT &= ~BIT0; // Pin 1.3 Low
P1OUT &= ~BIT3; // Pin 1.3 Low
P1OUT &= ~BIT4; //Pin 1.4 Low
TA1CCR1 = 199;
TA1CCR2 = 199;
}
声纳中断处理程序
在触发声纳后,您将需要这个时间让 Echo 引脚变低。
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if (CCTL0 & CCI) // Raising edge
{
up_counter = CCR0; // Copy counter to variable
}
else // Falling edge
{
// Formula: Distance in cm = (Time in uSec)/58
distance_cm = (CCR0 - up_counter)/58;
}
TA0CTL &= ~TAIFG; // Clear interrupt flag - handled
}
线路跟随
首先,我们将创建一个函数来根据行的位置返回一个值。例如,如果黑线低于第一个传感器,则函数将返回 1,如果黑线低于传感器 2 和传感器 3,则返回 2.5,依此类推。
int readLine()
{
//from left to right. Sensor output is high when white space is detected. Since we're seeking a black line,inputs are inverted
int sensor1 = !(P2IN&BIT0);
int sensor2 = !(P2IN&BIT2);
int sensor3 = !(P2IN&BIT3);
int sensor4 =!(P1IN&BIT6);
int sensor5 =!(P2IN&BIT4);
int sum = 0;
sensorpanelVal = (sensor1 * 1)+(sensor2* 2)+(sensor3 * 3)+(sensor4 *4)+(sensor5*5);
sum = (sensor1+sensor2+sensor3+sensor4+sensor5);
if (sum ==0){
return lastval;
}else{
lastval = sensorpanelVal/sum;
return lastval;
}
}
现在我们有了一个函数,可以根据黑线的位置给我们一个数值,我们可以开发一个比例和微分控制器来将位置保持在指定的设定点。
void lineFollow(){
val = readLine();
error = 3-val;
int delta = error-lasterror;
int change = Kp*error + Kd*delta;
lasterror = error;
int leftMotorPWM = BaseSpeed -change;
//constrain PWM
if(leftMotorPWM >199){
leftMotorPWM = 199;
}else if(leftMotorPWM <0){
leftMotorPWM = 0;
}
//constrain PWM
int rightMotorPWM = BaseSpeed + change;
if(rightMotorPWM >199){
rightMotorPWM = 199;
}else if(leftMotorPWM <0){
rightMotorPWM = 0;
}
SetSpeeds(leftMotorPWM,rightMotorPWM);
}
就是这样!现在您所要做的就是设置您的主要功能以运行引脚设置,并连续运行 linefollow() 功能。
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
MotorSetup();
IRSensorSetup();
SonarSetup();
while(1){
lineFollow();
if(sensorpanelVal ==15){
SetBrakes();
while(1){
}
}
}
}
在这里,如果机器人的所有 5 个传感器都在黑色表面上,我将无限期地停止机器人,但您可以使用声纳读数或任何其他 IR 传感器值组合来触发不同的功能。(可以使用全局变量 sensorpanelVal 访问)
结论
您可以修改 linefollow() 和 readline() 函数以适合您的机器人和您的表面。如果您需要在黑色表面上跟随白线,请将 readline() 中的线替换为这些线,
int sensor1 = (P2IN&BIT0); //For white line on black surface
int sensor2 = (P2IN&BIT2);
int sensor3 = (P2IN&BIT3);
int sensor4 = (P1IN&BIT6);
int sensor5 = (P2IN&BIT4);
您还必须调整 Kp 和 Kd 值,以使您的机器人沿着线走而不会丢失它。
- MSP430和IrDA通信开源分享
- MSP430管理电源排序和控制
- 基于MSP430的PWM操作 46次下载
- MSP430寄存器中文注释并且分析 9次下载
- MSP430单片机硬件知识学习1 30次下载
- MSP430单片机ADC模数转换操作 45次下载
- MSP430微处理器Value Line介绍 9次下载
- MSP430单片机实践篇之MSP430单片机ADC模数转换操作 43次下载
- 2013 MSP430 技术日 8次下载
- MSP430 实验板原理图 25次下载
- 基于 MSP430定时器的使用 9次下载
- MSP430教程14:MSP430单片机ADC12模块 55次下载
- msp430延时程序设计 0次下载
- 自制MSP430仿真工具的应用
- msp430封装库
- 如何为MSP430设计固件以收集和处理IC的数据 1881次阅读
- MSP430的中断分为哪3种?MSP430的中断优先级顺序是什么样的? 1.9w次阅读
- MSP430有哪些可屏蔽中断_MSP430中断的优先级 2833次阅读
- MSP430单片机定时器A结构及其应用范例 3928次阅读
- msp430无刷电机控制设计电路 9148次阅读
- 基于MSP430的SPI驱动编写之用MSP430驱动AFE4400 5192次阅读
- MSP430开发入门基础 C语言编程起步 6499次阅读
- MSP430单片机的选型及系列介绍 1.6w次阅读
- MSP430低功耗运行模式原理分析及应用 8864次阅读
- msp430介绍_msp430上拉电阻的使用 6698次阅读
- MSP430单片机的端口介绍 5296次阅读
- msp430学习的深度解析和总结 7063次阅读
- 基于MSP430的函数信号发生器设计方案 4402次阅读
- MSP430低功耗原理及其在海温测量中的应用 2258次阅读
- MSP430电路图集锦:创新设计思维 1.4w次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多