测量模块|使用STC8H1K28控制微型磁悬浮
■ 前言 在电磁铁的磁芯实验 中介绍了 Magnetic Levitation - The Easy Way | Elektor Magazine 中使用继电器线圈做磁悬浮的方式。电路非常简单,制作相对容易。
下面对该实验进行测试,并为今后使用模型建立打下基础。
01单片机电路模块1 1.电路模块设计
文章图片
▲ STC8H1K28原理图
文章图片
▲ STC8H1K28PCB图
- 用于实验的IO端口功能定义:
序号 | 符号 | 功能 |
---|---|---|
1 | ADC0 | 模拟输入0 |
2 | ADC1 | 模拟输入1 |
3 | GND | 电源地线 |
4 | +5V | 电源5V |
5 | PWM1 | PWM1 |
6 | PWM2 | PWM2 |
7 | PWM3 | PWM3 |
8 | PWM4 | PWM4 |
在使用PWM输出时,值需要引出 PWM1P2.单片机软件2 ● PWM输出 应用STC8H1K28的PWM1,2输出占空比可调波形,来控制线圈两端的电压。
功率输出部分使用了一款电机驱动MOS板来线圈。
▲ 实验电路以及电机驱动模块
输出PWM信号:
- 频率:10kHz;
- 幅值:12V;
- 占空比:0~100%
文章图片
▲ 输出PWM波形,频率为10kHz
02基本测试 1.测试施加电压与A1308的输出 在磁铁下面安装一个A1308线性HALL。测量在线圈施加PWM电压与A1308输出之间的关系。
设置MCU的PWM1,2 与电机驱动板连接、电机驱动板的输出与继电器线圈的连接极性,使得最终,施加的电压越大,HALL的输出越高。如果极性相反,只需要改变MCU与电机接口,或者电机接口与线圈之间的连接顺序即可。
文章图片
▲ A1308线性HALL安装位置
设置SetPWMOut函数,输入参数从-100~100。分别表示施加在继电器两端的电压从-12V到+12V 。
void SetPWMOut(int nRatio) {
unsigned long lnNumber;
unsigned char ucNegFlag;
unsigned int nNumber;
ucNegFlag = 0;
if(nRatio < 0) {
ucNegFlag = 1;
nRatio = -nRatio;
}
if(nRatio >= 100) nRatio = 100;
lnNumber = PWM1_ARR_2;
lnNumber *= nRatio;
lnNumber /= 100;
nNumber = (unsigned int)lnNumber;
if(ucNegFlag == 0) nNumber += PWM1_ARR_2;
else nNumber = PWM1_ARR_2 - nNumber;
PWM1SetDuty(nNumber);
PWM2SetDuty(PWM1_ARR_1 - nNumber);
}
文章图片
▲ SetPWMOut设置与线圈两端的电压之间的关系
将A1308的输出连接到STM8H1K28的ADC1(注意:不是0),读取AD1308的输出。
文章图片
▲ PWM设置与A1308输出的ADC
03施加反馈控制 从单片机的CH0读入设定电压值。
然后通过比较AD1308的电压值与输入设定电压,进行负反馈控制。
nDelta = ADCConvert() - nADC;
if(nDelta > 0) SetPWMOut(-99);
else SetPWMOut(99);
▲ 施加负反馈之后的悬浮状态
▲ 不加空气阻尼是悬浮振荡
※ 结论 对于使用继电器线圈制作电磁悬浮的小实验进行实验,初步验证了该方式的可行性。遗留一下问题为今后实验所证实, 对该实验中的各个器件进行数学建模,寻找悬浮稳定参数建立理论分析。
- 单片机AD工程文件:AD\Test\2020\Experiment\MagneticLevitation\MLSTC8H1K28.PcbDoc * ??
- 【测量模块|使用STC8H1K28控制微型磁悬浮】单片机控制软件工程:C51\STC\Test\2020\Experiment\MLSTC8H1K28\MLSTC8H1K28.uvproj ??
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- SpringBoot调用公共模块的自定义注解失效的解决
- Node.js中readline模块实现终端输入
- python自定义封装带颜色的logging模块
- 解决SpringBoot引用别的模块无法注入的问题
- iOS中的Block