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

標題: 基于stm32的下推式磁懸浮制作 附源程序與仿真原理圖 [打印本頁]

作者: 星河之間    時間: 2021-1-30 16:16
標題: 基于stm32的下推式磁懸浮制作 附源程序與仿真原理圖
很早就想做磁懸浮只是覺得有點難就一直沒有做,自學(xué)51單片機,又學(xué)了stm32后也一直沒有做過單片機項目,直到做設(shè)計的時候才想起用單片機做個磁懸浮玩玩。選用stm32也只是手頭上剛好有一塊,通過對網(wǎng)上的資料學(xué)習(xí)后以為對磁懸浮有點了解,做起來應(yīng)該不是很難,沒想到上手操作的時候還是有很多的坑。
其大概原理就是用四個線圈對浮子在前后左右的位置進行調(diào)整,浮子的位置用線性霍爾元件進行檢測,轉(zhuǎn)換為電壓后由單片機進行ADC采集

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

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


線性霍爾元件用的a3144,輸出只有幾百mv需要用運放將其放大,運放接5v話其最大輸出有4v左右,需要用兩個電阻將其限制在3.3v以下保護單片機,也可以用兩個二極管組成鉗位電路進行限制。(一定要用線性霍爾元件,并且要接運放將霍爾元件的輸出放大,對運放的輸出限制以免燒壞stm32單片機。


將霍爾元件,運放,以及鉗位電阻連接后,需要調(diào)節(jié)電位器使輸出電壓穩(wěn)定在1.7v附近

pid算法網(wǎng)上有很多這里就不解釋了,貼幾個連接https://blog.csdn.net/qq_25352981/article/details/81007075      https://blog.csdn.net/sdkdlwk/article/details/107759435
以下運用的是位置pid算法,pid參數(shù)調(diào)整時可以x,y軸一起調(diào)整,先調(diào)整kp也就是比例系數(shù),再調(diào)整kd微分系數(shù)。
  1. #define Max_Cycle 290//限制幅度
  2. #define Min_Cycle -290
  3. typedef struct//結(jié)構(gòu)體
  4. {
  5.    int targetValue;//設(shè)定值
  6.    int Error;//誤差
  7.    int prevError;//上次誤差
  8.    int Integral;//誤差積分
  9.    float Kp;//比例系數(shù)
  10.    float Ki;//沒用
  11.    float Kd;//微分系數(shù)
  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);//通過比例 積分 微分參數(shù)算出輸出控制量 可省略積分部分
  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. }

復(fù)制代碼

pwm主要就是控制電磁線圈的的磁力大小,從而控制浮子位置。將pid算法的輸出作為pwm的輸入,控制4路pwm的通斷
  1. void TIM3_GPIO_Config(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;

  4.         /* 設(shè)置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;                    // 復(fù)用推挽輸出
  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計數(shù)到299,即為300次,為一個定時周期
  30.   TIM_TimeBaseStructure.TIM_Prescaler = 11;            //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
  31.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //設(shè)置時鐘分頻系數(shù):不分頻(這里用不到)
  32.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上計數(shù)模式
  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;  //當定時器計數(shù)值小于CCR1_Val時為高電平
  38.   TIM_OCInitStructure.TIM_Pulse = 10;           //設(shè)置跳變值,當計數(shù)器計數(shù)到這個值時,電平發(fā)生跳變 可不設(shè)置
  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;          //設(shè)置通道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;          //設(shè)置通道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;          //設(shè)置通道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輸出處理函數(shù)</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. }
復(fù)制代碼
l298n接受單片機的pwm輸出,再輸出電壓到電磁線圈。
當所有電路連接好后,將強力磁鐵放在四個線圈的中間,再左右前后移動如感覺有斥力將浮子限制在中間則線路連接正確,否則要調(diào)整電路連接。
大磁鐵(為浮子提供主要支持力)的位置放置很重要,將浮子放在大磁鐵中間上方要感覺是有排斥力才行。大磁鐵最好放在板子也就是電磁線圈的下方,否者電磁線圈的控制力不足以控制浮子的姿態(tài)。或者加大輸入電磁線圈的電壓也行。

正面



背面





最終效果



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


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

作者: 51hei團團    時間: 2021-1-31 15:48
好資料,51黑有你更精彩!!!
作者: XDDZ1013    時間: 2021-2-16 17:10
看看,應(yīng)該不錯,學(xué)習(xí)一下。。。
作者: 卡洛琦    時間: 2021-2-17 17:30
謝謝!在就想搞個磁懸浮了
作者: yuanbioa    時間: 2021-3-3 10:54
請問需要兩個298N嗎
作者: aktuan007    時間: 2021-3-3 12:52
樓主這個線圈的參數(shù)能不能說的詳細點哈?多少匝多少亨哦?
作者: TKDRIVER    時間: 2021-3-5 18:18
你好,我想問問調(diào)試步驟是?
作者: 星河之間    時間: 2021-3-10 12:26
yuanbioa 發(fā)表于 2021-3-3 10:54
請問需要兩個298N嗎

一個,可以輸出兩路pwm
作者: 星河之間    時間: 2021-3-10 12:26
aktuan007 發(fā)表于 2021-3-3 12:52
樓主這個線圈的參數(shù)能不能說的詳細點哈?多少匝多少亨哦?

Taobao有直接買就行了
作者: 星河之間    時間: 2021-3-10 12:28
TKDRIVER 發(fā)表于 2021-3-5 18:18
你好,我想問問調(diào)試步驟是?

先調(diào)比例再調(diào)微分,在調(diào)試前要保證電路是正確的,線圈有輸出才行
作者: sim_99    時間: 2021-4-2 15:51
謝謝分享,做一個玩看看
作者: yaoshou    時間: 2024-7-29 08:33
謝謝樓主,資料挺全的
作者: luoyuke    時間: 2024-7-31 21:40
請問霍爾傳感器受各個方向磁場影響,沒有辦法辨別浮子偏離的方向怎么辦
作者: vnh    時間: 2024-9-20 15:29
請問是用什么軟件寫的代碼
作者: 51nihaoa    時間: 2024-9-24 16:45
不是KEIL嗎?




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久久久久久久久成人 | 九九国产 | 国产一区二区视频在线观看 | 国产精品欧美一区二区 | 我想看国产一级毛片 | 性色的免费视频 | 午夜伦理影院 | 中文字幕亚洲专区 | 亚洲综合色丁香婷婷六月图片 | av网站在线看 | 国产精品免费视频一区 | 免费看黄视频网站 | 成人国产免费视频 | 影视一区| 95国产精品 | 欧美综合久久久 | 欧美aaaaaaaaaa | 日韩久久久久久 | 日韩精品在线观看免费 | 黄色大片观看 | 草久在线视频 | 人人九九精 | 成人精品国产免费网站 | 一区二区久久精品 | 国产丝袜人妖cd露出 | 天天拍天天射 | 日韩欧美一级片 | 国产成人精品一区二区三区在线 | 欧美一级大片 | 又爽又黄axxx片免费观看 | 国产伦精品一区二区三区照片91 | 久久av资源网 | 免费毛片网站 | 精区3d动漫一品二品精区 | 欧美在线激情 | 亚洲精品久久久一区二区三区 | 99久久视频 | 中文字幕免费视频 | 亚洲成人免费在线观看 | 国内91在线 | 中文字幕久久久 |