最近在做上拉式磁悬浮,但是在csdn还有arduino中文社区上搜了一圈,好像没什么类似的,索性做完后就来记录一下我的经历吧,说不定可以给大家避避雷。
首先放一张常见不常见的几种方案,图片来自阿莫论坛,图中第三种不科学(电磁铁产生的磁场会干扰霍尔,而第二种上下两个霍尔可以抵消这种影响,我刚开始就是踩得这个坑),第四种太过少见也不是很了解。最经常见到的就是第一种和第二种。还用一种是在2的上面放一个磁铁去“拉”下方磁铁以抵消重力(参考下推式的原理)
我自己采用的是第二种,因为这种可以实现一体化(第一种需要上下两个部分。
踩坑:
先说说踩得坑;首先,做上拉式磁悬浮需要一个架子,重点来了,这个架子一定要结实可靠,不然极度搞心态(别问我怎么知道的555)
给大家看一下我的架子,淘宝六块钱买的5跟木头,然后用热熔胶拼的:
2、一定要共地!
3、板子上有AD的一般可以不用买信号放大器了,我买的是LM358模块,买回来发现没有用处。(32自带的好像是12位ADC,8位ADC的转换精度不确定需不需要,建议看看硬件手册)
4、杜邦线,洞洞板,热熔胶什么的多买点,反正也便宜,以后也能用。省的等快递时间
5、线圈会发热,如果是用热熔胶固定的霍尔元件得注意隔热(我是垫了层木板)
过程:
然后开始加工过程,我朴素的(简陋的)实践经验告诉我,一个这样的系统需要五部分,
- 控制部分(MCU,我用的正点原子的32Mini开发板);
- 传感部分(我用的线形霍尔503,直接接到板子上的ADC,通过软件滤波,注意32的adc接入电压最好不要超过3.3v);
- 驱动部分(我用的L298N成品模块);
- 电源部分(我用的一个12v转3.3v,5v的电源模块,外部12v电源是一个3-24v可调电源)
- 运动部分(这里是电磁铁,我用的是之前买好的成品线圈 ,有铁芯)
然后将硬件固定到洞洞板上,两个霍尔元件用线引出来(线最好长点)先不要固定。之后将洞洞板固定到架子上,然后先通电调试,之后写代码读取传感器示数 :
我基本上都是用的正点原子的官方代码库,如果有看不懂的可以留言,看见就回。
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "adc.h"
#include "pwm.h"
#include "key.h"
u16 PID_Cal(PID *pp,u16 adc_2,u16 adc_1);
u16 pwm_next_val=0;
int main(void)
{
u8 t=0;
u16 adcx,adcx2;
u32 ERR;
pp.SetPoint=500; pp.P=12.2; pp.I=0; pp.D=29; //这个参数不是很好
pp.LastError=0;
//float temp;
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
Adc_Init(); //ADC初始化
KEY_Init();
//TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
LED0=0;
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,<