上拉式磁悬浮制作经历与踩坑~(基于stm32f103, Arduino 和51没试过,不过应该类似)

最近在做上拉式磁悬浮,但是在csdn还有arduino中文社区上搜了一圈,好像没什么类似的,索性做完后就来记录一下我的经历吧,说不定可以给大家避避雷。

首先放一张常见不常见的几种方案,图片来自阿莫论坛,图中第三种不科学(电磁铁产生的磁场会干扰霍尔,而第二种上下两个霍尔可以抵消这种影响,我刚开始就是踩得这个坑),第四种太过少见也不是很了解。最经常见到的就是第一种和第二种。还用一种是在2的上面放一个磁铁去“拉”下方磁铁以抵消重力(参考下推式的原理)
在这里插入图片描述我自己采用的是第二种,因为这种可以实现一体化(第一种需要上下两个部分。

踩坑:

先说说踩得坑;首先,做上拉式磁悬浮需要一个架子,重点来了,这个架子一定要结实可靠,不然极度搞心态(别问我怎么知道的555)
给大家看一下我的架子,淘宝六块钱买的5跟木头,然后用热熔胶拼的:
在这里插入图片描述
2、一定要共地!
3、板子上有AD的一般可以不用买信号放大器了,我买的是LM358模块,买回来发现没有用处。(32自带的好像是12位ADC,8位ADC的转换精度不确定需不需要,建议看看硬件手册)
4、杜邦线,洞洞板,热熔胶什么的多买点,反正也便宜,以后也能用。省的等快递时间
5、线圈会发热,如果是用热熔胶固定的霍尔元件得注意隔热(我是垫了层木板)

过程:
然后开始加工过程,我朴素的(简陋的)实践经验告诉我,一个这样的系统需要五部分,

  1. 控制部分(MCU,我用的正点原子的32Mini开发板);
  2. 传感部分(我用的线形霍尔503,直接接到板子上的ADC,通过软件滤波,注意32的adc接入电压最好不要超过3.3v);
  3. 驱动部分(我用的L298N成品模块);
  4. 电源部分(我用的一个12v转3.3v,5v的电源模块,外部12v电源是一个3-24v可调电源)
  5. 运动部分(这里是电磁铁,我用的是之前买好的成品线圈 ,有铁芯)

然后将硬件固定到洞洞板上,两个霍尔元件用线引出来(线最好长点)先不要固定。之后将洞洞板固定到架子上,然后先通电调试,之后写代码读取传感器示数 :

我基本上都是用的正点原子的官方代码库,如果有看不懂的可以留言,看见就回。

#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,<
### 使用STM32开发光学转速仪 #### 设备选型硬件准备 为了构建基于STM32的光学转速计,需选用带有定时器功能的微控制器型号,如STM32F103系列。此款MCU具备足够的处理能力来捕捉来自光电传感器的脉冲信号并计算旋转速度[^1]。 #### 软件环境搭建 建议采用官方支持的IDE——STM32CubeIDE来进行编程工作。通过该集成开发环境可以方便地配置外设参数以及编写应用程序代码。此外,还需安装必要的库文件以便于操作GPIO端口其他外围设备。 #### 接口连接说明 按照所使用的具体光电开关类型(例如槽或反射),将其输出端接入至选定的I/O引脚作为中断源之一;同时设置另一个通用IO用于指示灯或其他反馈机制。对于上述提到的基础磁悬浮控制系统中的Arduino实例,在移植到STM32平台时可参照类似的接法模[^2]: - **光电传感器输入**:连接至外部中断触发引脚(如PA0) - **LED状态显示**:可通过PWM方控制亮度变化(如PB5) #### 主要算法逻辑描述 核心在于利用定时器捕获事件间隔时间从而推算出每分钟转动次数(RPM),即每当检测到一次有效的下降沿跳变,则记录当前时刻并前次比较得出周期T,再由公`RPM=60/T*N`求得最终结果(N代表齿轮上的齿数)[^4]。 以下是简化版C语言实现框架: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim2; uint8_t count = 0; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE); //使能更新中断 while (1){ /* USER CODE BEGIN WHILE */ /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } } // 定义外部中断服务函数 void EXTI0_IRQHandler(void){ if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_0)){ __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0); TIM2->CNT=0; // 清零计数值 count++; if(count>=N){ // N为设定的目标采样点数目 uint32_t time_diff=(htim2.Instance->CCR1)-(htim2.Instance->ARR)*count/N; float rpm=((float)(60*SystemCoreClock)/(time_diff)); // 发送数据给串口监视器或者其他地方... count=0; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值