DSP28335实现直流电机转速闭环控制系统
本系统基于普中科技的DSP28335开发板,构建了一套完整的直流有刷电机PID调速方案。系统集成了500线AB相增量式编码器用于反馈测速,并结合L298N驱动模块实现正反转控制与调速功能。同时扩展了LCD1602显示屏、DHT11温湿度传感器、蜂鸣器报警单元、LED指示灯以及矩阵键盘输入模块,形成一个多功能人机交互闭环控制系统。
系统支持通过键盘设定目标转速,采用PID算法进行实时调节,具备超速检测与自动降速保护机制。运行过程中,当前环境温度与湿度信息持续更新显示于LCD1602屏幕,增强了系统的实用性与可观测性。
硬件架构设计
整个系统的外围设备配置如下:
- L298N电机驱动模块:连接至电机供电回路,接收来自DSP的PWM信号和方向控制信号,驱动直流电机运转。
- 编码器接口:500线增量编码器输出A/B相信号,直接接入DSP28335的QEP(正交编码脉冲)专用引脚,利用片上定时器模块完成位置与速度采集。
- LCD1602液晶屏:采用4位数据模式连接,节省GPIO资源,用于实时显示当前转速、设定值、温度、湿度等关键参数。
- DHT11传感器:挂载在任意可用GPIO口上,周期性读取环境温湿度并刷新显示。
- 矩阵键盘:使用跳线帽配置为4×3布局,占用较少IO的同时保留足够按键数量,便于设置数值及操作模式切换。
- 蜂鸣器与LED:作为声光报警装置,在电机超速时触发断续鸣响与呼吸灯效果,提升异常状态提示效果。
编码器测速与中断处理
由于编码器为500线,经四倍频后每圈可产生2000个脉冲,因此需确保捕获精度与时效性。系统设定1ms周期性中断服务程序来读取EQep寄存器中的计数值,并将其转换为实际转速(RPM)。
该部分对寄存器访问顺序要求严格,若操作不当会导致数据异常或锁死现象。以下为核心中断逻辑执行流程:
#pragma CODE_SECTION(eqep1Isr,"RAMfuncs");
interrupt void eqep1Isr(void){
static int32 old_pos=0;
int32 new_pos = EQep1Regs.QPOSCNT;
motor_rpm = (new_pos - old_pos)*60/(4*500)*1000; //每转2000脉冲,采样周期1ms
old_pos = new_pos;
EQep1Regs.ICCLR.bit.INT=1; //清中断
}
每次进入定时中断均清零计数缓存并重新采样,避免累积误差影响PID控制器性能。
PID控制策略实现
PID模块是整个系统的核心控制单元。经过多次调试优化,最终确定比例、积分、微分参数组合,使系统响应快速且稳定。
关键实现细节包括:
- 精确的时间间隔dt来源于定时器中断的时间戳差值,保证积分与微分项计算准确。
- 引入积分限幅机制,防止启动或突加负载时积分饱和导致严重超调。
- 输出经限幅后作用于PWM占空比,从而调节电机电压实现平滑变速。
下图为PID控制算法核心代码片段:
float pid_update(PID* pid, float actual){
pid->error = pid->target - actual;
float p_out = pid->kp * pid->error;
pid->integral += pid->ki * pid->error * dt;
if(pid->integral > pid->max_i) pid->integral = pid->max_i;
else if(pid->integral < -pid->max_i) pid->integral = -pid->max_i;
float d_out = pid->kd * (pid->error - pid->prev_error)/dt;
pid->prev_error = pid->error;
float output = p_out + pid->integral + d_out;
return output > pid->max_out ? pid->max_out : (output < -pid->max_out ? -pid->max_out : output);
}
温湿度采集与显示逻辑
DHT11的数据通信依赖严格的时序控制,其单总线协议容易受编译器优化干扰。为此,关键延时函数采用volatile修饰变量,防止被编译器优化删除。
实际开发中,通过示波器反复抓取波形调整循环次数,以匹配DHT11所需的高低电平持续时间。数据接收过程包含校验环节,一旦发现错误则最多重试三次,保障LCD显示内容的稳定性。
void dht11_delay_us(int us){
volatile int i = us * 8; //实测主频150MHz时这个系数刚好
while(i--);
}
键盘扫描与用户交互机制
矩阵键盘采用状态机方式进行扫描处理,兼顾去抖动与长按识别功能。短按用于逐级增减设定值,长按则实现连续加速调节,松手即锁定当前目标转速。
这种设计显著提升了操作效率,尤其在需要大范围调整转速时更为便捷。
uint16 key_scan(){
static uint8 last_state[12] = {0};
static uint16 hold_cnt[12] = {0};
for(int i=0; i<12; i++){
if(key_pressed(i)){
if(last_state[i] == 0){ //首次按下
last_state[i] = 1;
return i;
}
if(++hold_cnt[i] > 1000){ //长按1秒
hold_cnt[i] = 0;
return i | 0x8000; //高位标记长按
}
}else{
last_state[i] = 0;
hold_cnt[i] = 0;
}
}
return 0xFFFF;
}
报警与状态反馈机制
当检测到实际转速超过预设上限时,系统立即启动报警逻辑:
- 蜂鸣器发出间歇式声响,模拟《野蜂飞舞》节奏,虽未使用PWM驱动,但断续发声更具听觉辨识度。
- LED配合实现呼吸灯效果,增强视觉警示。
该设计原本受限于蜂鸣器模块仅支持高低电平控制,却意外获得更醒目的报警表现。
if(abs(motor_rpm) > MAX_SPEED){
static uint16 pwm_val = 0;
static int dir = 1;
pwm_val += dir*50;
if(pwm_val >= 3000) dir = -1;
else if(pwm_val <= 0) dir = 1;
PWM_set(AUX_PWM, pwm_val); //呼吸灯效果
BUZZER_ON();
DELAY_MS(50);
BUZZER_OFF();
}
系统运行效果
系统调通当日,LCD同步刷新转速、温湿度数据,键盘控制正反转流畅自如,超速时声光联动报警,整体呈现出一种数字控制与物理机械交融的独特体验——仿佛赛博朋克遇见蒸汽时代。
源码中隐藏若干彩蛋功能,例如长按“*”和“#”键可切换不同组PID参数,未在文档中明示,留给后续探索者自行发掘乐趣。
接线清晰、程序完整,按照说明连接电路并下载固件即可复现全部功能,适合学习DSP控制、闭环系统设计及相关外设驱动开发。


雷达卡


京公网安备 11010802022788号







