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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 16252|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
很早就想做磁懸浮只是覺(jué)得有點(diǎn)難就一直沒(méi)有做,自學(xué)51單片機(jī),又學(xué)了stm32后也一直沒(méi)有做過(guò)單片機(jī)項(xiàng)目,直到做設(shè)計(jì)的時(shí)候才想起用單片機(jī)做個(gè)磁懸浮玩玩。選用stm32也只是手頭上剛好有一塊,通過(guò)對(duì)網(wǎng)上的資料學(xué)習(xí)后以為對(duì)磁懸浮有點(diǎn)了解,做起來(lái)應(yīng)該不是很難,沒(méi)想到上手操作的時(shí)候還是有很多的坑。
其大概原理就是用四個(gè)線圈對(duì)浮子在前后左右的位置進(jìn)行調(diào)整,浮子的位置用線性霍爾元件進(jìn)行檢測(cè),轉(zhuǎn)換為電壓后由單片機(jī)進(jìn)行ADC采集

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

本項(xiàng)目的重點(diǎn)就是霍爾傳感器的信號(hào)放大以及ad采集,pid算法,pwm輸出還有就是磁鐵的放置位置。


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


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

pid算法網(wǎng)上有很多這里就不解釋了,貼幾個(gè)連接https://blog.csdn.net/qq_25352981/article/details/81007075      https://blog.csdn.net/sdkdlwk/article/details/107759435
以下運(yùn)用的是位置pid算法,pid參數(shù)調(diào)整時(shí)可以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;//沒(méi)用
  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);                                        //      誤差有正負(fù)
  19.    
  20.    pid->Integral += pid->Error;                                                                                //                   誤差累計(jì)
  21.    
  22.    Differential = pid->Error - pid->prevError;    //       微分部分本次誤差減去上次誤差
  23.                        
  24.    output = (pid->Kp * pid->Error + pid->Integral * pid->Ki + pid->Kd * Differential);//通過(guò)比例 積分 微分參數(shù)算出輸出控制量 可省略積分部分
  25.    
  26.    pid->prevError = pid->Error;                                                                                //       本次誤差賦值為上次
  27.    
  28.    if(output>Max_Cycle)                           //        超過(guò)上限則輸出恒定值
  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信號(hào)電平跳變值 */
  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;       //當(dāng)定時(shí)器從0計(jì)數(shù)到299,即為300次,為一個(gè)定時(shí)周期
  30.   TIM_TimeBaseStructure.TIM_Prescaler = 11;            //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
  31.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //設(shè)置時(shí)鐘分頻系數(shù):不分頻(這里用不到)
  32.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上計(jì)數(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;  //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1_Val時(shí)為高電平
  38.   TIM_OCInitStructure.TIM_Pulse = 10;           //設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(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的電平跳變值,輸出另外一個(gè)占空比的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的電平跳變值,輸出另外一個(gè)占空比的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的電平跳變值,輸出另外一個(gè)占空比的PWM
  56.   TIM_OC4Init(TIM3, &TIM_OCInitStructure);          //使能通道2
  57.   TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

  58.   /* TIM3 enable counter */
  59.   TIM_Cmd(TIM3, ENABLE);                   //使能定時(shí)器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接受單片機(jī)的pwm輸出,再輸出電壓到電磁線圈。
當(dāng)所有電路連接好后,將強(qiáng)力磁鐵放在四個(gè)線圈的中間,再左右前后移動(dòng)如感覺(jué)有斥力將浮子限制在中間則線路連接正確,否則要調(diào)整電路連接。
大磁鐵(為浮子提供主要支持力)的位置放置很重要,將浮子放在大磁鐵中間上方要感覺(jué)是有排斥力才行。大磁鐵最好放在板子也就是電磁線圈的下方,否者電磁線圈的控制力不足以控制浮子的姿態(tài);蛘呒哟筝斎腚姶啪圈的電壓也行。

正面



背面





最終效果



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


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

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:200118 發(fā)表于 2021-2-16 17:10 | 只看該作者
看看,應(yīng)該不錯(cuò),學(xué)習(xí)一下。。。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
ID:316764 發(fā)表于 2021-3-3 10:54 | 只看該作者
請(qǐng)問(wèn)需要兩個(gè)298N嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:582255 發(fā)表于 2021-3-3 12:52 | 只看該作者
樓主這個(gè)線圈的參數(shù)能不能說(shuō)的詳細(xì)點(diǎn)哈?多少匝多少亨哦?
回復(fù)

使用道具 舉報(bào)

7#
ID:456557 發(fā)表于 2021-3-5 18:18 | 只看該作者
你好,我想問(wèn)問(wèn)調(diào)試步驟是?
回復(fù)

使用道具 舉報(bào)

8#
ID:527981 發(fā)表于 2021-3-10 12:26 | 只看該作者
yuanbioa 發(fā)表于 2021-3-3 10:54
請(qǐng)問(wèn)需要兩個(gè)298N嗎

一個(gè),可以輸出兩路pwm
回復(fù)

使用道具 舉報(bào)

9#
ID:527981 發(fā)表于 2021-3-10 12:26 | 只看該作者
aktuan007 發(fā)表于 2021-3-3 12:52
樓主這個(gè)線圈的參數(shù)能不能說(shuō)的詳細(xì)點(diǎn)哈?多少匝多少亨哦?

Taobao有直接買(mǎi)就行了
回復(fù)

使用道具 舉報(bào)

10#
ID:527981 發(fā)表于 2021-3-10 12:28 | 只看該作者
TKDRIVER 發(fā)表于 2021-3-5 18:18
你好,我想問(wèn)問(wèn)調(diào)試步驟是?

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

13#
ID:1129974 發(fā)表于 2024-7-31 21:40 | 只看該作者
請(qǐng)問(wèn)霍爾傳感器受各個(gè)方向磁場(chǎng)影響,沒(méi)有辦法辨別浮子偏離的方向怎么辦
回復(fù)

使用道具 舉報(bào)

14#
ID:1132214 發(fā)表于 2024-9-20 15:29 | 只看該作者
請(qǐng)問(wèn)是用什么軟件寫(xiě)的代碼
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产电影一区二区在线观看 | 国产精品一区久久久 | 欧美精品一区二区三区在线播放 | 香蕉久久a毛片 | 欧美日本在线观看 | 中文字幕免费视频 | 夜操 | 午夜成人免费视频 | 亚洲欧美激情精品一区二区 | 中文字幕一区在线观看视频 | 国产综合欧美 | 夜夜夜久久久 | av黄色免费在线观看 | www.欧美| 国产精品毛片一区二区在线看 | 国产精品福利一区二区三区 | 日韩1区 | 91久久精品一区二区二区 | 成年人免费在线视频 | 一区二区三区亚洲 | 国产98色在线 | 日韩在线播放一区 | 毛片网络| 性一爱一乱一交一视频 | 欧美高清hd | 老头搡老女人毛片视频在线看 | 精品久久久久国产 | 日韩免费视频一区二区 | 日本一区二区视频 | 日本视频一区二区三区 | 成人网av | h视频网站在线观看 | 午夜国产一级 | 亚洲欧美在线免费观看 | 中文字幕在线观看一区 | 久久久久免费精品国产 | 午夜影院在线观看 | 久久一区精品 | 亚洲天天干 | 一区二区三区电影在线观看 | 国产亚洲精品久久午夜玫瑰园 |