🎈这是我大三的时候用TI的MSP432P401R弄得一个遥感小车,现在开源出来给大家玩玩。
🎈不需要积分就可以下载哦,如果喜欢的话就留下点赞、收藏、关注吧!😉
🎈资源下载地址:超简单的MSP432P401R实现遥感小车
✨如果有任何不懂得欢迎大家留言评论,我会及时回复的
相关资源
一、硬件准备
1. 两块MSP432P401R最小系统板(一个用来控制小车,一块用来作遥控器的控制板,就是豪😁)
2. 1块MPU6050
3. 两块HC05蓝牙模块
4. 电机(带不带编码器都行)
5. 一块锂电池
6. 小车模型
二、系统框架&软件设计
2.1 系统框架
2.2 软件设计
2.2.1 小车软件设计
小车软件流程图
小车定时器中断代码
void T32_INT2_IRQHandler(void) {
MAP_Timer32_clearInterruptFlag(TIMER32_1_BASE);
/* Interrupt service program local variable */
static int Cnt = 0;
static int resultpid_R=0;
static int resultpid_L=0;
static int speed,RorL;
/* Interrupt service program local variable */
/* Interrupt service program start */
int R,L;
int temp1,temp2;
Cnt++;
if(dataready==1)
{
dataready=0;
temp1=PitchValue/5; //根据俯仰角计算速度
speed=temp1*100;
if(speed>1000)
{
speed=1000;
}
else if(speed<-1000)
{
speed=-1000;
}
speed=-speed;
temp2=RollValue/10;
RorL=temp2*100; // 根据横滚角roll计算两轮差速,实现左右旋转
if(RorL>1000)
{
RorL=1000;
}
else if(RorL<-1000)
{
RorL=-1000;
}
}
/* 计算两个轮子的速度 */
if(Cnt % 100 == 0)
{
GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
}
resultpid_L=0;
resultpid_R=0;
R=(int16_t)(resultpid_R+speed+RorL);
L=(int16_t)(resultpid_L+speed-RorL);
if(R<0)
{
R=-R;
Motor_Direction_Change(RightMotor, 0,1); // 右电机方向改变
}
else if(R>0)
{
Motor_Direction_Change(RightMotor, 1,0); // 右电机方向改变
}
if(L<0)
{
L=L-50;
L=-L;
Motor_Direction_Change(LeftMotor, 0,1); // 做电机方向改变
}
else if(L>0)
{
L=L+50;
Motor_Direction_Change(LeftMotor, 1,0); // 做电机方向改变
}
// printf("R:%d,L:%d\r\n",R,L);
MAP_Timer_A_setCompareValue(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, R); //在速度pid的结果上减去偏差
MAP_Timer_A_setCompareValue(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_2, L); //在速度pid的结果上加上偏差
/* End of interrupt service program */
}
小车数据解析代码
if(overflag==1) // 串口数据是否接收完一帧数据
{
if(UART2_RX_BUF[0]=='{' ) // 确保数据接收正确
{
cJSON *Receive;
Receive=cJSON_Parse(UART2_RX_BUF);
if(!Receive) // 如果没有创建成功,删除JSON,清空接收缓冲区,数组索引置零,超时标志置零
{
printf("DataError");
cJSON_Delete(Receive);
}
else // 否则提取JSON中的数据
{
_Roll=cJSON_GetObjectItem(Receive,"Roll");
_Pitch=cJSON_GetObjectItem(Receive,"Pitch");
PitchValue=_Pitch->valuedouble;
RollValue=_Roll->valuedouble;
dataready=1;
cJSON_Delete(Receive);
}
}
memset(UART2_RX_BUF,'\0',64);
index_buffer=0;
overflag=0;
}
2.2.2 遥控器
遥控器main函数
int main(void) { //以下是各功能的测试
/* local variable */
long time=0;
cJSON *Position;
cJSON *_Roll,*_Pitch;
/* Start of system initialization */
LED_Init(); //LED初始化,用来验证某个模块是否工作
systick_config(); //滴答定时器初始化
uart0_init(); //串口0初始化
Bluetooth_Init(115200);
IIC_Init();
TIM32_1_Int_Init(3000,TIMER32_PRESCALER_16); //每1ms秒进入一次Timer32中断
/* End of system initializatioan */
/* Start to set some initial parameters */
/* End setting some initial parameters */
delay_ms(500);
mpu6050_dmp_init();
char buffer[20];
while (1) {
DMP_update();
sprintf(buffer,"{\"Roll\":%.2f,\"Pitch\":%.2f}",Roll,Pitch); //数值转字符串
bluetooth_send("%s\r\n",buffer);
delay_ms(20);
}
}