使用CCS基于msp432p401r写一段让小车实现正转30秒后调头再行驶30秒的代码
时间: 2024-03-05 11:55:13 浏览: 22
下面是使用CCS基于msp432p401r写的一段让小车实现正转30秒后调头再行驶30秒的代码:
```c
#include "msp.h"
#define MOTOR_LEFT_EN P2OUT_bit.P6OUT
#define MOTOR_LEFT_P1 P2OUT_bit.P4OUT
#define MOTOR_LEFT_P2 P2OUT_bit.P5OUT
#define MOTOR_RIGHT_EN P2OUT_bit.P7OUT
#define MOTOR_RIGHT_P1 P2OUT_bit.P2OUT
#define MOTOR_RIGHT_P2 P2OUT_bit.P3OUT
#define MOTOR_PWM_PERIOD 1200
#define MOTOR_PWM_DUTY 600
void delay_ms(uint32_t ms);
int main(void)
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // stop watchdog timer
// 初始化GPIO
// 左电机PWM
P2DIR |= BIT6;
P2SEL0 |= BIT6;
P2SEL1 &= ~BIT6;
MOTOR_LEFT_EN = 1;
// 左电机方向
P2DIR |= BIT4 | BIT5;
P2OUT &= ~(BIT4 | BIT5);
// 右电机PWM
P2DIR |= BIT7;
P2SEL0 |= BIT7;
P2SEL1 &= ~BIT7;
MOTOR_RIGHT_EN = 1;
// 右电机方向
P2DIR |= BIT2 | BIT3;
P2OUT &= ~(BIT2 | BIT3);
// 正转30秒
MOTOR_LEFT_P1 = 1;
MOTOR_LEFT_P2 = 0;
MOTOR_RIGHT_P1 = 1;
MOTOR_RIGHT_P2 = 0;
TIMER_A0->CCR[0] = MOTOR_PWM_PERIOD;
TIMER_A0->CCR[1] = MOTOR_PWM_DUTY;
TIMER_A0->CCR[2] = MOTOR_PWM_DUTY;
TIMER_A0->CCR[3] = 0;
TIMER_A0->CTL = TIMER_A_CTL_TASSEL_2 | TIMER_A_CTL_MC_1 | TIMER_A_CTL_CLR;
delay_ms(30000);
// 调头
MOTOR_LEFT_P1 = 0;
MOTOR_LEFT_P2 = 1;
MOTOR_RIGHT_P1 = 1;
MOTOR_RIGHT_P2 = 0;
TIMER_A0->CCR[0] = MOTOR_PWM_PERIOD;
TIMER_A0->CCR[1] = MOTOR_PWM_DUTY;
TIMER_A0->CCR[2] = 0;
TIMER_A0->CCR[3] = MOTOR_PWM_DUTY;
TIMER_A0->CTL = TIMER_A_CTL_TASSEL_2 | TIMER_A_CTL_MC_1 | TIMER_A_CTL_CLR;
delay_ms(1000);
// 反转30秒
MOTOR_LEFT_P1 = 0;
MOTOR_LEFT_P2 = 1;
MOTOR_RIGHT_P1 = 0;
MOTOR_RIGHT_P2 = 1;
TIMER_A0->CCR[0] = MOTOR_PWM_PERIOD;
TIMER_A0->CCR[1] = MOTOR_PWM_DUTY;
TIMER_A0->CCR[2] = MOTOR_PWM_DUTY;
TIMER_A0->CCR[3] = 0;
TIMER_A0->CTL = TIMER_A_CTL_TASSEL_2 | TIMER_A_CTL_MC_1 | TIMER_A_CTL_CLR;
delay_ms(30000);
// 停车
MOTOR_LEFT_EN = 0;
MOTOR_RIGHT_EN = 0;
while (1);
}
// 延时函数,使用SMCLK作为时钟源,1MHz时钟频率
void delay_ms(uint32_t ms)
{
TIMER_A1->CTL = TIMER_A_CTL_TASSEL_2 | TIMER_A_CTL_MC_1 | TIMER_A_CTL_CLR;
TIMER_A1->CCR[0] = 1000 - 1;
while (ms--)
{
TIMER_A1->CTL |= TIMER_A_CTL_CLR;
while (!(TIMER_A1->CTL & TIMER_A_CTL_IFG));
}
}
```
该代码中使用了定时器和PWM模块来控制电机的转速和转向。在正转和反转时,左右电机的PWM输出相同,电机转速相同,小车直行。在调头时,左右电机的PWM输出不同,电机转速不同,小车实现了转向。在每次操作完成后,程序都会进入一个30秒的延时,从而实现了正转30秒后调头再行驶30秒的功能。