这是我在我的小师傅的要求的第二个小车实践,其实好几天前就做好了的。
代码是用CCS软件编写,并导入到单片机中的。
这次的实践要了解红外循迹的原理及PWM变速模块。
预备知识:
一、PWM模块(调速)
设置PWM相关寄存器
void _L1(int arr, int psc)
{
P1SEL |= BIT5; //电机驱动模块L298N引脚ENA口,控制左边的电机速度
P1DIR |= BIT5; //定义单片机上的输出引脚
TA0CTL |= MC_1+TASSEL_2; //Timer_A控制寄存器设置为增计数模式
TA0CCTL4 = OUTMOD_7; //捕获/比较控制寄存器设置输出模式7
TA0CCR0 = arr-1; //Timer_A捕获/比较寄存器
TA0CCR4=psc;
TA0CTL |= TACLR;
//TA0CTL
Timer_A已清除。设置此位可清除TAR、时钟分频器逻辑(分频器设置保持不变)和计数方向。TACLR位将自动复位,并始终读取为零。
}
PWM的配置具体要查询5529的数据手册和用户手册,大家不要因为是英文就不去用它。
关于PWM的原理大家可以去B站上看MSP430G2553的视频,有一个UP主讲解的比较好,并且2553与5529的原理相通,便于大家理解。
二、红外模块
红外循迹原理图
D3:发出红外信号
D4:接受红外信号
R1、R6 分压电阻
P1_OUT:当检测到黑线时D4收不到反射到地面的红外信号,并向out口传出一个低电平。该口可以与控制芯片相连,可作为判断条件。
//left,right detection二路循迹
P3DIR &=~ BIT0+BIT3; 定义红外信号检测位
// P2REN |= BIT2+BIT7;
三、主程序
#include <msp430f5529.h>
#include "pwm.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门
//motor
P6DIR |= BIT0+BIT1;//左电机
P6DIR |= BIT2+BIT3;//右边电机
//led
P1DIR |= BIT0;
P4DIR |= BIT7;
P1OUT &=~ BIT0;
P4OUT &=~ BIT7;
//left,right detection
P3DIR &=~ BIT0+BIT3;
P2REN |= BIT2+BIT7;
while(1)
{
if(((P3IN & BIT0)==0) && ((P3IN & BIT3)==0))//向前
{
P1OUT |= BIT0;
P4OUT |= BIT7;
__delay_cycles(100);
P6OUT |= BIT0;
P6OUT &=~ BIT1;
P6OUT |= BIT2;
P6OUT &=~ BIT3;
setPWM_R1(20000, 3500);
setPWM_L1(20000, 3500);
}
if((P3IN & BIT0) && (P3IN & BIT3))//向后
{
P1OUT &=~ BIT0;
P4OUT &=~ BIT7;
__delay_cycles(100);
P6OUT &=~ BIT0;
P6OUT &=~ BIT1;
P6OUT &=~ BIT2;
P6OUT &=~ BIT3;
}
if((P3IN & BIT0) && ((P3IN & BIT3)==0))//右偏
{
P1OUT |= BIT0;
P4OUT &=~ BIT7;
__delay_cycles(100);
P6OUT &=~ BIT0;
P6OUT |= BIT1;
P6OUT |= BIT2;
P6OUT &=~ BIT3;
setPWM_R1(20000, 3500);
setPWM_L1(20000, 3500);
}
if(((P3IN & BIT0)==0) && (P3IN & BIT3))//左偏
{
P1OUT &=~ BIT0;
P4OUT |= BIT7;
__delay_cycles(100);
P6OUT |= BIT0;
P6OUT &=~ BIT1;
P6OUT &=~ BIT2;
P6OUT |= BIT3;
setPWM_R1(20000, 3500);
setPWM_L1(20000, 3500);
}
__no_operation(); //空操作
}
}
}
}
全部资料51hei下载地址:
car.7z
(24.59 KB, 下载次数: 83)
|