久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16360|回復: 14
打印 上一主題 下一主題
收起左側

基于stm32的下推式磁懸浮制作 附源程序與仿真原理圖

  [復制鏈接]
跳轉到指定樓層
樓主
很早就想做磁懸浮只是覺得有點難就一直沒有做,自學51單片機,又學了stm32后也一直沒有做過單片機項目,直到做設計的時候才想起用單片機做個磁懸浮玩玩。選用stm32也只是手頭上剛好有一塊,通過對網上的資料學習后以為對磁懸浮有點了解,做起來應該不是很難,沒想到上手操作的時候還是有很多的坑。
其大概原理就是用四個線圈對浮子在前后左右的位置進行調整,浮子的位置用線性霍爾元件進行檢測,轉換為電壓后由單片機進行ADC采集

單片機將采集的位置數據分別進行x,y軸的pid算法處理,輸出pwm控制電磁線圈的磁力從而控制浮子的位置。

本項目的重點就是霍爾傳感器的信號放大以及ad采集,pid算法,pwm輸出還有就是磁鐵的放置位置。


線性霍爾元件用的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輸出,再輸出電壓到電磁線圈。
當所有電路連接好后,將強力磁鐵放在四個線圈的中間,再左右前后移動如感覺有斥力將浮子限制在中間則線路連接正確,否則要調整電路連接。
大磁鐵(為浮子提供主要支持力)的位置放置很重要,將浮子放在大磁鐵中間上方要感覺是有排斥力才行。大磁鐵最好放在板子也就是電磁線圈的下方,否者電磁線圈的控制力不足以控制浮子的姿態。或者加大輸入電磁線圈的電壓也行。

正面



背面





最終效果



材料
stm32c8t6
lm358n運放
a3144線性霍爾元件
l298n
2個電位器10k
兩個100k電阻
四個4.7k電阻
兩個15k電阻
四個19*12電磁線圈
100*60*15環形磁鐵
20*3銣磁鐵
4個m3的螺絲


Proteus仿真與程序資料51hei下載地址:
磁懸浮stm32.7z (231.26 KB, 下載次數: 258)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏24 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:328014 發表于 2021-1-31 15:48 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:200118 發表于 2021-2-16 17:10 | 只看該作者
看看,應該不錯,學習一下。。。
回復

使用道具 舉報

地板
ID:110257 發表于 2021-2-17 17:30 | 只看該作者
謝謝!在就想搞個磁懸浮了
回復

使用道具 舉報

5#
ID:316764 發表于 2021-3-3 10:54 | 只看該作者
請問需要兩個298N嗎
回復

使用道具 舉報

6#
ID:582255 發表于 2021-3-3 12:52 | 只看該作者
樓主這個線圈的參數能不能說的詳細點哈?多少匝多少亨哦?
回復

使用道具 舉報

7#
ID:456557 發表于 2021-3-5 18:18 | 只看該作者
你好,我想問問調試步驟是?
回復

使用道具 舉報

8#
ID:527981 發表于 2021-3-10 12:26 | 只看該作者
yuanbioa 發表于 2021-3-3 10:54
請問需要兩個298N嗎

一個,可以輸出兩路pwm
回復

使用道具 舉報

9#
ID:527981 發表于 2021-3-10 12:26 | 只看該作者
aktuan007 發表于 2021-3-3 12:52
樓主這個線圈的參數能不能說的詳細點哈?多少匝多少亨哦?

Taobao有直接買就行了
回復

使用道具 舉報

10#
ID:527981 發表于 2021-3-10 12:28 | 只看該作者
TKDRIVER 發表于 2021-3-5 18:18
你好,我想問問調試步驟是?

先調比例再調微分,在調試前要保證電路是正確的,線圈有輸出才行
回復

使用道具 舉報

11#
ID:900013 發表于 2021-4-2 15:51 | 只看該作者
謝謝分享,做一個玩看看
回復

使用道具 舉報

12#
ID:1129754 發表于 2024-7-29 08:33 | 只看該作者
謝謝樓主,資料挺全的
回復

使用道具 舉報

13#
ID:1129974 發表于 2024-7-31 21:40 | 只看該作者
請問霍爾傳感器受各個方向磁場影響,沒有辦法辨別浮子偏離的方向怎么辦
回復

使用道具 舉報

14#
ID:1132214 發表于 2024-9-20 15:29 | 只看該作者
請問是用什么軟件寫的代碼
回復

使用道具 舉報

15#
ID:1062243 發表于 2024-9-24 16:45 | 只看該作者
不是KEIL嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产四区 | 久久精品色欧美aⅴ一区二区 | 亚洲欧美日韩精品 | 国产视频导航 | 久草网站 | 巨大荫蒂视频欧美另类大 | 久久精品综合 | 伊人精品在线 | www国产亚洲精品久久网站 | 一区二区三区中文字幕 | 玩丰满女领导对白露脸hd | 国产精品久久久久久一区二区三区 | av激情在线 | 久久成人精品一区二区三区 | 午夜小视频免费观看 | 日韩在线视频播放 | 99热精品在线| 丝袜 亚洲 欧美 日韩 综合 | 免费看国产一级特黄aaaa大片 | 色天天综合 | 国产成人久久精品 | 国产精品视频一区二区三区 | 中文字幕国产视频 | 精品乱码一区二区 | se婷婷| 欧州一区二区三区 | 日日日操 | 一区二区成人 | 国产蜜臀97一区二区三区 | 中文字幕在线观看一区 | 国产黄色一级电影 | 草久久久 | 亚洲精品www久久久 www.蜜桃av | 欧美精品1区2区3区 免费黄篇 | 欧美日韩在线免费 | 大象一区| 91精品久久久久久久久久入口 | 国产精品女人久久久 | 欧美美女二区 | 日韩免费一区 | 超碰97av|