找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11030|回复: 10
收起左侧

基于stm32的下推式磁悬浮制作 附源程序与仿真原理图

  [复制链接]
ID:527981 发表于 2021-1-30 16:16 | 显示全部楼层 |阅读模式
很早就想做磁悬浮只是觉得有点难就一直没有做,自学51单片机,又学了stm32后也一直没有做过单片机项目,直到做设计的时候才想起用单片机做个磁悬浮玩玩。选用stm32也只是手头上刚好有一块,通过对网上的资料学习后以为对磁悬浮有点了解,做起来应该不是很难,没想到上手操作的时候还是有很多的坑。
其大概原理就是用四个线圈对浮子在前后左右的位置进行调整,浮子的位置用线性霍尔元件进行检测,转换为电压后由单片机进行ADC采集
磁悬浮图片原理.png
单片机将采集的位置数据分别进行x,y轴的pid算法处理,输出pwm控制电磁线圈的磁力从而控制浮子的位置。

本项目的重点就是霍尔传感器的信号放大以及ad采集,pid算法,pwm输出还有就是磁铁的放置位置。
磁悬浮电路.png

线性霍尔元件用的a3144,输出只有几百mv需要用运放将其放大,运放接5v话其最大输出有4v左右,需要用两个电阻将其限制在3.3v以下保护单片机,也可以用两个二极管组成钳位电路进行限制。(一定要用线性霍尔元件,并且要接运放将霍尔元件的输出放大,对运放的输出限制以免烧坏stm32单片机。


将霍尔元件,运放,以及钳位电阻连接后,需要调节电位器使输出电压稳定在1.7v附近

pid算法网上有很多这里就不解释了,贴几个连接https://blog.csdn.net/qq_25352981/article/details/81007075      https://blog.csdn.net/sdkdlwk/article/details/107759435
以下运用的是位置pid算法,pid参数调整时可以x,y轴一起调整,先调整kp也就是比例系数,再调整kd微分系数。
  1. #define Max_Cycle 290//限制幅度
  2. #define Min_Cycle -290
  3. typedef struct//结构体
  4. {
  5.    int targetValue;//设定值
  6.    int Error;//误差
  7.    int prevError;//上次误差
  8.    int Integral;//误差积分
  9.    float Kp;//比例系数
  10.    float Ki;//没用
  11.    float Kd;//微分系数
  12. }PID;
  13. int  Calc_PID(PID *pid,int Pos)//位置PID
  14. {
  15.    int output;
  16.    int Differential;//微分变量
  17.    
  18.    pid->Error = (pid->targetValue - Pos);                                        //      误差有正负
  19.    
  20.    pid->Integral += pid->Error;                                                                                //                   误差累计
  21.    
  22.    Differential = pid->Error - pid->prevError;    //       微分部分本次误差减去上次误差
  23.                        
  24.    output = (pid->Kp * pid->Error + pid->Integral * pid->Ki + pid->Kd * Differential);//通过比例 积分 微分参数算出输出控制量 可省略积分部分
  25.    
  26.    pid->prevError = pid->Error;                                                                                //       本次误差赋值为上次
  27.    
  28.    if(output>Max_Cycle)                           //        超过上限则输出恒定值
  29.      output = Max_Cycle;
  30.          
  31.          if(output<Min_Cycle)
  32.                  output = Min_Cycle;

  33.    return output;
  34. }


  35. void Init_PID_Parameter(void)
  36. {
  37.    xPID.targetValue = 2300; //  
  38.    yPID.targetValue = 2300;
  39.          xPID.Error = 0;
  40.          yPID.Error = 0;
  41.    xPID.prevError=0;
  42.          yPID.prevError=0;
  43.         
  44.    xPID.Ki = 0.0f;  
  45.    yPID.Ki = 0.0f;

  46.    xPID.Kp = 0.3f;
  47.    yPID.Kp = 0.3f;  
  48.   
  49.    xPID.Kd = 0.60f;
  50.    yPID.Kd = 0.60f;
  51. }

复制代码

pwm主要就是控制电磁线圈的的磁力大小,从而控制浮子位置。将pid算法的输出作为pwm的输入,控制4路pwm的通断
  1. void TIM3_GPIO_Config(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;

  4.         /* 设置TIM3CLK 为 72MHZ */
  5.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  6.   /* GPIOA and GPIOB clock enable */
  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );

  8.   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  9.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  11.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.   /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
  14.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  15.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  16. }
  17. void TIM3_Mode_Config(void)
  18. {
  19.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  20.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  21.         /* PWM信号电平跳变值 */
  22. /*         u16 CCR1_Val  ;        
  23.          u16 CCR2_Val  ;
  24.         CCR1_Val=CCR1_value;
  25.   CCR2_Val=CCR2_value;
  26.         */
  27. //周期为12K  72M/ARR+1/PSC+1

  28.   /* Time base configuration */                 
  29.   TIM_TimeBaseStructure.TIM_Period =299;       //当定时器从0计数到299,即为300次,为一个定时周期
  30.   TIM_TimeBaseStructure.TIM_Prescaler = 11;            //设置预分频:不预分频,即为72MHz
  31.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频(这里用不到)
  32.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  33.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  34.   /* PWM1 Mode configuration: Channel1 */
  35.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  36.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        
  37.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  38.   TIM_OCInitStructure.TIM_Pulse = 10;           //设置跳变值,当计数器计数到这个值时,电平发生跳变 可不设置
  39.   TIM_OC1Init(TIM3, &TIM_OCInitStructure);         //使能通道1
  40.   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  41.   /* PWM1 Mode configuration: Channel2 */
  42.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  43.   TIM_OCInitStructure.TIM_Pulse = 10;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  44.   TIM_OC2Init(TIM3, &TIM_OCInitStructure);          //使能通道2
  45.   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  46.         
  47.         /*TIM3的通道3*/
  48.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  49.   TIM_OCInitStructure.TIM_Pulse = 10;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  50.   TIM_OC3Init(TIM3, &TIM_OCInitStructure);          //使能通道2
  51.   TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  52.         
  53.         /*TIM 通道 4*/
  54.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  55.   TIM_OCInitStructure.TIM_Pulse = 10;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  56.   TIM_OC4Init(TIM3, &TIM_OCInitStructure);          //使能通道2
  57.   TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

  58.   /* TIM3 enable counter */
  59.   TIM_Cmd(TIM3, ENABLE);                   //使能定时器3        
  60. }

  61. /**
  62.   * 初始化
  63.   */
  64. void TIM3_PWM_Init(void)
  65. {
  66.         TIM3_GPIO_Config();
  67.         TIM3_Mode_Config();        
  68. }</div><div>//pwm输出处理函数</div><div>
  69.   void TIM3_OutSequence1zhuoyou(int Shuzhi){
  70.         if(Shuzhi>0){
  71.                 TIM_SetCompare1(TIM3,0);
  72.                 TIM_SetCompare2(TIM3,Shuzhi);
  73.         
  74.         }
  75.         else {
  76.                 TIM_SetCompare1(TIM3,Shuzhi*(-1));
  77.                 TIM_SetCompare2(TIM3,0);
  78.         
  79.         }
  80. }

  81. void TIM3_OutSequence1shangxia(int Shuzhi){
  82.         if(Shuzhi>0){
  83.                 TIM_SetCompare3(TIM3,0);
  84.                 TIM_SetCompare4(TIM3,Shuzhi);
  85.         
  86.         }
  87.         else {
  88.                 TIM_SetCompare3(TIM3,Shuzhi*(-1));
  89.                 TIM_SetCompare4(TIM3,0);
  90.         }

  91. }
复制代码
l298n接受单片机的pwm输出,再输出电压到电磁线圈。
当所有电路连接好后,将强力磁铁放在四个线圈的中间,再左右前后移动如感觉有斥力将浮子限制在中间则线路连接正确,否则要调整电路连接。
大磁铁(为浮子提供主要支持力)的位置放置很重要,将浮子放在大磁铁中间上方要感觉是有排斥力才行。大磁铁最好放在板子也就是电磁线圈的下方,否者电磁线圈的控制力不足以控制浮子的姿态。或者加大输入电磁线圈的电压也行。

正面

板子203.jpg

背面

板子背面.jpg

IMG_20210105_222252.jpg

最终效果

VID_20210129_144633[00-00-00--00-00-04].gif

材料
stm32c8t6
lm358n运放
a3144线性霍尔元件
l298n
2个电位器10k
两个100k电阻
四个4.7k电阻
两个15k电阻
四个19*12电磁线圈
100*60*15环形磁铁
20*3铷磁铁
4个m3的螺丝
51hei.png

Proteus仿真与程序资料51hei下载地址:
磁悬浮stm32.7z (231.26 KB, 下载次数: 208)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2021-1-31 15:48 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:200118 发表于 2021-2-16 17:10 | 显示全部楼层
看看,应该不错,学习一下。。。
回复

使用道具 举报

ID:110257 发表于 2021-2-17 17:30 | 显示全部楼层
谢谢!在就想搞个磁悬浮了
回复

使用道具 举报

ID:316764 发表于 2021-3-3 10:54 | 显示全部楼层
请问需要两个298N吗
回复

使用道具 举报

ID:582255 发表于 2021-3-3 12:52 | 显示全部楼层
楼主这个线圈的参数能不能说的详细点哈?多少匝多少亨哦?
回复

使用道具 举报

ID:456557 发表于 2021-3-5 18:18 | 显示全部楼层
你好,我想问问调试步骤是?
回复

使用道具 举报

ID:527981 发表于 2021-3-10 12:26 | 显示全部楼层
yuanbioa 发表于 2021-3-3 10:54
请问需要两个298N吗

一个,可以输出两路pwm
回复

使用道具 举报

ID:527981 发表于 2021-3-10 12:26 | 显示全部楼层
aktuan007 发表于 2021-3-3 12:52
楼主这个线圈的参数能不能说的详细点哈?多少匝多少亨哦?

Taobao有直接买就行了
回复

使用道具 举报

ID:527981 发表于 2021-3-10 12:28 | 显示全部楼层
TKDRIVER 发表于 2021-3-5 18:18
你好,我想问问调试步骤是?

先调比例再调微分,在调试前要保证电路是正确的,线圈有输出才行
回复

使用道具 举报

ID:900013 发表于 2021-4-2 15:51 | 显示全部楼层
谢谢分享,做一个玩看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表