我是学自动化控制的,因为都知道的原因,没法回到学校,我们这个学期学习过程控制,各种各样的pid控制算法(单回路、串级、前馈、分程等等),非常想去实验室亲手操作体验他们的控制效果。 刚好老师布置了一个单容自衡水箱的实验,其实要说完成这个实验非常简单,你只需要一个塑料水瓶和一个水龙头就好了。但是我想借此机会做一个除了完成任务也可以练习各种控制算法的装置,以加深我对各种控制的理解。
一开始我选用的是水压原理的液位传感器,但是它的测量误差可以达到5cm,但是对于我的40cm水箱(酒盒)来说误差比例太大了。最后经过考虑我选用浮板加超声波传感器的方法。正好手里有一块us100超声波传感器,看资料说他自带看门狗、温度补偿等很好的功能。我用图中的材料做出来这样一个双容水箱的模型。哈哈,是不是很丑。水泵那个宝8块钱买的,当时怕坏我买了两个,现在看来用这两个电机可以完成分程控制的实验了,哈哈。大水箱用一个水桶就可以了。水管是内径8mm的,好像是2元一米。开关是1元一个,转换头2元一个。换买了一个4分孔的电钻打孔器好像是3元,还有一些胶带,防水胶,螺丝等小东西。
控制器我选择stm32f103zet6,因为手里正好有这个和其下载器。我打算把液位用波形的形式展现出来,这样好观察控制效果。因为之前做智能车,调d车的陀螺仪和加速度计的卡尔曼滤波用的就是这个方法,轻车熟路还是那个模拟示波器(师哥写的),还是那个协议。就很快移植完成了(从k60到32)。然后就是读取us100超声波传感器的数据了,因为它支持串口通讯,所以也很轻松。给他发个字符0x58(好像是,具体见其手册)。成品做完以后,当天下午调了一下简单pid与积分分离式pid,后者比前者要好很多。当我的水位离目标水位太远时,前者的积分会积很多的误差,导致系统的超调特别大,而且到达平稳的时间很长。后者积分分离式,把积分调节静态误差的能力发挥到了极致,很棒。
当然这个东西缺点超级多,也算给大家个参考吧!加油,努力过好每一天。
第一次写怎么多的文字,哈哈,献给亲切的51论坛。
单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "usart.h"
- #include "timer.h"
-
- int main(void)
- {
- u16 led0pwmval=0;
- u8 dir=1;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
- uart2_init();
- LED_Init(); //LED端口初始化
- TIM2_Int_Init(999,7199);//10Khz的计数频率,计数到100为100ms
- TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz
-
- while(1)
- {
- // delay_ms(10);
- // if(dir)led0pwmval++;
- // else led0pwmval--;
- // if(led0pwmval>900)dir=0;
- // if(led0pwmval==0)dir=1;
- //
- }
- }
复制代码
所有资料51hei提供下载:
pi调节水位.7z
(189.14 KB, 下载次数: 67)
exe文件:
虚拟示波器v0.1.3.zip
(4.22 MB, 下载次数: 48)
|