使用TM4C123G配合L298N电机驱动小车动起来的代码
时间: 2024-04-24 21:25:46 浏览: 89
用L298N电机驱动电路
4星 · 用户满意度95%
以下是使用TM4C123G微控制器和L298N电机驱动器驱动小车的示例代码:
```c
#include <stdint.h>
#include "tm4c123gh6pm.h"
#define MOTOR_ENA_PWM_PERIOD 4000 // PWM周期
#define MOTOR_ENA_PWM_DUTY 2000 // PWM占空比
void delay_ms(uint32_t milliseconds) {
uint32_t i, j;
for (i = 0; i < milliseconds; i++) {
for (j = 0; j < 3180; j++) {} // 延时一毫秒
}
}
void PWM_init() {
SYSCTL_RCGCPWM_R |= SYSCTL_RCGCPWM_R0; // 使能PWM模块0时钟
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R1; // 使能GPIO PortB时钟
GPIO_PORTB_AFSEL_R |= 0x30; // PB4和PB5引脚配置为PWM功能
GPIO_PORTB_PCTL_R |= GPIO_PCTL_PB4_M1PWM2 | GPIO_PCTL_PB5_M1PWM3;
PWM0_2_CTL_R = 0; // 关闭PWM模块2
PWM0_3_CTL_R = 0; // 关闭PWM模块3
PWM0_2_GENA_R = PWM_1_GENA_ACTCMPAD_ZERO | PWM_1_GENA_ACTLOAD_ONE;
PWM0_2_LOAD_R = MOTOR_ENA_PWM_PERIOD - 1;
PWM0_2_CMPA_R = MOTOR_ENA_PWM_DUTY - 1;
PWM0_3_GENA_R = PWM_1_GENA_ACTCMPAD_ZERO | PWM_1_GENA_ACTLOAD_ONE;
PWM0_3_LOAD_R = MOTOR_ENA_PWM_PERIOD - 1;
PWM0_3_CMPA_R = MOTOR_ENA_PWM_DUTY - 1;
PWM0_2_CTL_R = PWM_1_CTL_ENABLE; // 启动PWM模块2
PWM0_3_CTL_R = PWM_1_CTL_ENABLE; // 启动PWM模块3
PWM0_ENABLE_R = PWM_ENABLE_PWM2EN | PWM_ENABLE_PWM3EN; // 使能PWM输出
}
void motor_forward() {
GPIO_PORTB_DATA_R |= 0x08; // IN1引脚置高
GPIO_PORTB_DATA_R &= ~0x04; // IN2引脚置低
GPIO_PORTB_DATA_R |= 0x20; // IN3引脚置高
GPIO_PORTB_DATA_R &= ~0x10; // IN4引脚置低
}
void motor_backward() {
GPIO_PORTB_DATA_R &= ~0x08; // IN1引脚置低
GPIO_PORTB_DATA_R |= 0x04; // IN2引脚置高
GPIO_PORTB_DATA_R &= ~0x20; // IN3引脚置低
GPIO_PORTB_DATA_R |= 0x10; // IN4引脚置高
}
void motor_stop() {
GPIO_PORTB_DATA_R &= ~0x0C; // IN1和IN2引脚置低
GPIO_PORTB_DATA_R &= ~0x30; // IN3和IN4引脚置低
}
int main(void) {
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R1; // 使能GPIO PortB时钟
GPIO_PORTB_DIR_R |= 0x3C; // 设置PB2、PB3、PB4和PB5引脚为输出
GPIO_PORTB_DEN_R |= 0x3C; // 使能PB2、PB3、PB4和PB5引脚的数字功能
PWM_init();
while (1) {
motor_forward(); // 前进
delay_ms(2000); // 延时2秒
motor_backward(); // 后退
delay_ms(2000); // 延时2秒
motor_stop(); // 停止
delay_ms(2000); // 延时2秒
}
}
```
这段代码使用了PWM模块0的PWM2和PWM3通道来控制L298N电机驱动器的IN1、IN2、IN3和IN4引脚。通过调整`MOTOR_ENA_PWM_PERIOD`和`MOTOR_ENA_PWM_DUTY`宏定义的值可以调整PWM周期和占空比,从而控制电机的速度。
请注意,以上代码仅供参考,具体使用时需要根据实际硬件连接和电机驱动器的驱动方式进行适当的修改。
阅读全文