引言
在嵌入式控制系统中,数模转换(DAC)与模数转换(ADC)是实现 “数字信号 - 模拟信号” 交互的核心环节,广泛应用于信号调理、电压调节、小型闭环控制等场景。对于低成本、低功耗的小型嵌入式项目而言,选择适配性强的主控芯片,并结合简洁的外围电路实现精准的信号控制,是兼顾成本与性能的关键需求。
本实验以 CW32L012 为主控核心,搭建由 10kΩ 电阻与 47μF 电容构成的 RC 滤波电路:以 MCU 的 DAC 输出(Vdac)作为 RC 电路的输入信号,采集经过 RC 电路平滑后的 ADC 电压(Vadc),并通过软件闭环控制算法,将 Vadc 稳定调节至预设的目标电压值。
本实验的开展,不仅可验证 CW32L012 在 “DAC 输出 - RC 调理 - ADC 采集 - 闭环控制” 链路中的功能可行性,还可加深PID在控制系统中的运用和理解,还能提供一套简洁、低成本的模拟信号闭环调节方案,为小型嵌入式系统中的电压精准控制、信号稳定输出等需求提供实践参考。
一、CW32L012C8T6主控
CW32L012 是武汉芯源半导体 (CW) 推出的 32 位低功耗 MCU,基于 ARM Cortex-M0 + 内核,主频高达 96MHz,集成64KB Flash和8KB RAM,专为需要高性价比和低功耗的应用设计。
1.1核心规格:
1.2主要设计亮点与应用场景:
完整的信号链集成芯片集成了从模拟信号采集(ADC)、数字处理(MCU核心)到模拟控制输出(DAC和运放)的完整链路,可以说是一颗完整信号链混合信号MCU。这意味着在工业传感器、信号调理等场景中,可以减少甚至省去外部的模拟调理芯片,简化设计并降低成本。
硬件加速提升实时性能内置的CORDIC和EAU硬件加速单元是关键特色。在电机控制、数字电源等需要快速进行三角函数、开方、除法运算的实时控制场景中,这些硬件单元能数十倍地提升计算速度,减轻CPU负担,实现更高效的控制算法。
兼顾性能与低功耗基于M0+内核和低功耗工艺,芯片支持Sleep和DeepSleep等低功耗模式。在DeepSleep模式下,功耗可降至微安(µA)级别,非常适合电池供电的物联网设备、便携式仪器等应用。
二、实验硬件及接线
2.1硬件与原理图:
2.2硬件接线:
CW32L012主控板PA4--->RC滤波电路Vadc
CW32L012主控板PB0--->RC滤波电路Vdac
CW32L012主控板GND--->RC滤波电路GND
CW32L012主控板PA9--->串口模块的RX
CW32L012主控板PA10--->串口模块的TX
完整接线如图:
三、实验软件
3.1项目框图:
按键:作为人机交互输入单元,用于设置目标电压值,Kp,Ki,Kd;
Vdac:CW32L012 的 DAC 外设输出端,是 RC 滤波电路的输入信号源;
CW32L012:系统核心,负责接收按键指令、驱动 DAC 输出 Vdac、采集 Vadc 反馈信号、运行闭环控制算法,同时将数据通过串口上传、在 LCD 屏幕显示状态;
Vadc:RC 滤波电路的输出端,作为 CW32L012 的 ADC 采集输入,提供电压反馈信号;
LCD 屏幕:实时显示目标电压、当前 Vadc 实际值、Kp,Ki,Kd,输出电压Vdac等参数,直观呈现实验结果;
串口:用于将目标电压、当前 Vadc 实际值发送到上位机观察波形,直观感受数据变化趋势。
3.2闭环控制框图:
通过按键或者程序给系统设定一个目标电压值,然后PID计算实际与目标值之间的偏差,将计算结果作用到DAC模块输出电压作用到RC电路的输入端,此时RC电路的输出端电压会产生变化,再用ADC实时检测输出端的实际电压,重复进行上述流程,实现RC电路输出端电压的闭环控制。
3.3内部电压跟随器:
内部运算放大器的使用:
为了降低IO口的输出阻抗,这里使用了CW32L012的内部运算放大器,并将产生DAC电压的IO口PB1接到了运放的同相输入端,将PB0接到了运放的输出端口,然后将其初始化为电压跟随器模式。
void OPA1_Init(void){__SYSCTRL_GPIOB_CLK_ENABLE();__SYSCTRL_OPA_CLK_ENABLE();AFx_OPA1OUT_PB00();OPA_InitTypeDef OPA_InitStr;OPA_InitStr.Bias=OPA_BIAS_1UA_36US;OPA_InitStr.InputN=OPA_INPUT_NONE;OPA_InitStr.InputP=OPA_INPUT_INP3;OPA_InitStr.PgaGain=OPA_PGA_GAIN2;OPA_InitStr.WorkMode=OPA_WORKMODE_FOLLOWER;OPA_Init(CW_OPA1,&OPA_InitStr);OPA_Start(CW_OPA1);}
3.4 PID控制算法:
在这个 Vdac-Vadc 的电压闭环控制实验中,选择了增量式 PID:
减少电压波动
实验中,输出的执行器是DAC,其数字量范围为0~4095,并且将新的数字量写入DHR寄存器后,若无新值写入,DAC会持续输出上一次所写数字量对应的电压,即执行器具有保持功能,所以在此基础上选择了增量式PID,将每次的计算结果加上上一次的输出作为最终输出,这样DAC变化更平滑,电压波动小。
避免积分饱和
位置式 PID 需要持续累积积分项,若目标电压(设定值)突变(比如按键修改设定值)或偏差长期存在,易出现积分饱和(积分项过大导致控制量超出 DAC 输出范围),进而引发 Vdac 输出跳变、Vadc 超调严重。增量式 PID 的输出是 “控制量的变化量”,无积分项的累积,天然避免了积分饱和问题,调节过程更平缓,适配电压稳定控制中 “小步长、低超调” 的需求。
匹配 Vdac 的小范围调节特性
实验中,Vdac 的调节目标是让 Vadc 稳定在设定值(属于小范围、连续的电压校正),增量式 PID 输出的 “调节增量” 刚好适配这种场景 —— 每次仅微调 Vdac 的输出值,避免 Vdac 大幅跳变导致 RC 电路的电压变化跟不上,能让 Vadc 更平滑地趋近设定值。
#define Error_Scale 15uint16_t pid_control(void){static float out_last=0;set_pid_para();//更新pid参数temper_pid.err=Error_Scale*(temper_pid.target-temper_pid.actual);//误差缩放指定倍数再进行计算temper_pid.out=temper_pid.Kp*(temper_pid.err-temper_pid.err_last)+temper_pid.Ki*temper_pid.err +temper_pid.Kd*(temper_pid.err-2*temper_pid.err_last+temper_pid.err_last_last);// 更新误差历史(前2次 → 前1次,前1次 → 当前)temper_pid.err_last_last = temper_pid.err_last;temper_pid.err_last =temper_pid.err;float temp=out_last+temper_pid.out;temp=(temp>DAC_MAX)? DAC_MAX:temp;//输出限幅temp=(temp<0)? 0:temp;out_last=temp;return temp;}
四、实验现象
4.1 屏幕:与屏幕对应的变量含义:
4.2 按键:
按键1(左):对光标所选中的参数进行加操作
按键2(中):对光标所选中的参数进行减操作
按键3(右):切换光标选择的内容
4.3 串口:
使用VOFA+软件连接串口,CW32会将设定、实际电压(放大十倍),Kp,Ki,Kd几个参数打印到上位机,显示波形
4.4 PID参数整定:
4.4.1 P参数整定:
将 I D设为0,P设为10,输出响应小,达不到控制目标
将 I D设为0,P增大到40,输出响应略微超调,仍达不到控制目标
将 I D设为0,P增大到45,输出响应略微超调,仍达不到控制目标,此时P参数整定完毕
4.4.2参数整定:
将 D设为0,P设为45,I设为20,引入积分消除静差,此时积分作用小,静差消除慢
将 D设为0,P设为45,I增大到50,增强积分作用,,静差消除快,I整定完毕
4.4.3 D 参数整定:
引入微分作用后会造成震荡,并且本系统超调和震荡并不严重,可以不引入微分作用
所以这里将D设定为0,D参数整定完毕
总结
本次基于 CW32L012 的 Vdac-Vadc 电压闭环控制实验,以 “10kΩ+47μF”RC 电路为信号调理单元,结合增量式 PID 算法实现了 Vadc 对设定电压的稳定跟踪;而通过上位机波形实时观测与手动 PID 参数整定的实践,更直观地验证了 PID 三参数的核心作用,完整串联了硬件架构、算法选择与参数调试的实验链路。
扫码加入QQ群 3群| 610403240
246