122 0

[互联网] DSP28335直流电机闭环控制:PID调节与多传感器集成系统 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-5-16
最后登录
2018-5-16

楼主
牙牙的小猪佩奇 发表于 2025-12-1 12:21:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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控制、闭环系统设计及相关外设驱动开发。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:直流电机 传感器 pid DSP 直流电

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-19 19:09