Keil5程序和app inventor代码都给出了,可有偿困扰我好久了



关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题描述: 使用Keil5和app inventor开发了一个小车控制系统,小车上两个电机分别由L293D电机驱动芯片控制,根据app inventor上的图形界面发送控制指令,控制小车前进、左转、右转或停止。但是现在发现小车转的时候速度不一致,有时候左转会快过右转,有时候前进会比后退慢。 问题分析: 根据问题描述,很可能是电机的速度控制不精准导致的问题。L293D电机驱动芯片只能控制电机的正反转,要控制电机的速度需要通过PWM信号控制,但是app inventor的图形界面并没有直接提供控制PWM的功能,因此可能需要在Keil5中对PWM信号进行控制。另外,可能还需要考虑电机的转速匹配问题,即使两个电机一开始的转速相同,由于摩擦力等原因,实际上转速可能会逐渐不同步。 解决方案:
#include <8051.h>
void main() {
// 设置定时器鉴频,1us
TMOD = 0x11; // T1采用模式1,T0为低4位
TH1 = 0xF8; // 定时器初值
TL1 = 0xCC; // 定时器初值
TR1 = 1; // 启动定时器
ET1 = 1; // 打开定时器中断
EA = 1; // 打开总中断
while (1) {
// 根据需要的PWM占空比设置比较值
CCAP1H = 0x5A;
CCAP1L = 0x5A;
// 等待一段时间
for (int i = 0; i < 10000; i++);
// 根据需要的PWM占空比设置比较值
CCAP1H = 0xA5;
CCAP1L = 0xA5;
// 等待一段时间
for (int i = 0; i < 10000; i++);
}
}
// PID控制算法
void pid_control() {
// 计算误差
error = set_speed - real_speed;
// 更新积分项
integral += error;
// 更新微分项
derivative = error - pre_error;
pre_error = error;
// 计算控制量
control_value = Kp * error + Ki * integral + Kd * derivative;
// 转换为PWM信号
CCAP1 = control_value;
}