[程序源码] STM8单片机控制磁悬浮源代码

[复制链接]
2599|5
手机看帖
扫描二维码
随时随地手机跟帖
panxiaoyi|  楼主 | 2021-10-13 21:28 | 显示全部楼层 |阅读模式
本帖最后由 panxiaoyi 于 2021-11-8 14:38 编辑

如图:a 、b 是线性霍尔传感器 49E,经LMV358反相放大31倍,49E、STM8、LMV358的供电都是3.3V
调整LMV358的静态输出电压到1.65V
电磁铁 A1、A2 串联,当A1吸时,A2就推,软件控制可正反工作,B1、B2 也是一样
A1 A2轴由霍尔a提供信号,B1 B2轴由霍尔b提供信号
程序计数溢出才中断,比较匹配时不中断
进入中断后检测a或者b信号,然后调整和输出单次脉冲,驱动A1A2或者B1B2,同时中断结束。 脉冲驱动的H桥电路是L298N,再驱动电磁铁
脉冲消失后定时器继续计数到溢出才中断,中断时,由于剩磁基本消失,因此检测a或者b的信号受到的干扰比较小
程序每秒中断2000次,第一次中断调整A1A2轴,第二次中断调整B1B2轴,如此循环。
微信图片_20211013212448.jpg
磁悬浮01.PNG

STM8S105 磁悬浮.rar

967.01 KB,

使用特权

评论回复
panxiaoyi|  楼主 | 2021-10-13 21:39 | 显示全部楼层
本帖最后由 panxiaoyi 于 2021-11-8 14:42 编辑

https://bbs.21ic.com/icview-3069754-1-1.html
这个是我用AVR ATtiny13做的简单的上拉式磁悬浮,可以正常工作

使用特权

评论回复
panxiaoyi|  楼主 | 2021-10-13 21:41 | 显示全部楼层
本帖最后由 panxiaoyi 于 2021-11-8 14:46 编辑

上面的帖子已经更新,源代码可以下载,下面是部分源代码

//STM8S105_IAR_V3.11
//本例由panxiaoyi(QQ68354248)原创,并在21ic.com首发,转载请保留,谢谢!

#include "stdio.h"
#include "iostm8s105k4.h"
#include "SYSTEM.h"
#include "UART.h"
#include "ADC.h"
#include "TIME.h"
#include "PID.h"

#define KP   60
#define KI   190
#define KD   0

#define ADC4 529                                        //南北Y
#define ADC5 522                                        //东西X
#define HA_OUT PD_ODR_ODR3                              //A组是南北方向
#define HB_OUT PD_ODR_ODR4

unsigned char i;
unsigned short adc_dat;
short gap;                                              //差距
short amend;                                            //修正值

//-----------------------------------------------

#pragma vector=15+2                                     //更新/上溢出/中断向量
__interrupt void TIM3_UPD_OVF_BRK_IRQHandler(void)
{
  TIM3_CCMR1_OC1M=0;                                    //冻结模式
  TIM3_CCMR2_OC2M=0;                                    //冻结模式
  
  if(i)                                                 //读取调整A组
  {
    ADC_Start(4);
    adc_dat=ADC_Read();
    gap=adc_dat-ADC4;
    if(gap>150) gap=150;
    if(gap<(-150)) gap=(-150);
    amend=PID(gap,KP,KI,KD);                            //注意数据是否会溢出
   
    //printf("A %d  ",adc_dat);
   
    if(amend>0)
    {
      TIM3_CH1_OutOnePulse(1,amend);                    //输出H电平的调整单脉冲
      HA_OUT=0;                                         //当脉冲输出H电平时,本配对要输出0电平来配对
    }
    else
    {
      TIM3_CH1_OutOnePulse(0,(0-amend));                //输出反相单脉冲
      HA_OUT=1;
    }
  }
else //------------------------------------------       //读取调整B组
  {
    ADC_Start(5);
    adc_dat=ADC_Read();
    gap=adc_dat-ADC5;
    if(gap>150) gap=150;
    if(gap<(-150)) gap=(-150);
    amend=PID2(gap,KP,KI,KD);                            //注意数据是否会溢出

    //printf("B %d\n",adc_dat);
   
    if(amend>0)
    {
      TIM3_CH2_OutOnePulse(1,amend);                    //输出H电平的调整单脉冲
      HB_OUT=0;                                         //当脉冲输出H电平时,本配对要输出0电平来配对
    }
    else
    {
      TIM3_CH2_OutOnePulse(0,(0-amend));                //输出反相单脉冲
      HB_OUT=1;
    }
  }

  PE_ODR_ODR5=~PE_ODR_ODR5;
  TIM3_SR1_UIF=0;                                       //清零更新中断标志
  i=~i;
}

//-----------------------------------------------

int main( void )
{
  SYSTEM_Init();                                        //系统初始化
  UART2_Init();                                         //串口2初始化
  ADC_Init(4);                                          //初始化ADC
  IO_Init();
  TIM3_OnePulseInit();                                  //单脉冲初始化

  printf("QQ68354248\n");                               //发送字符串变量
  
  asm("RIM");                                           //插入汇编,使能全局中断

  TIM3_CH1_OutOnePulse(1,100);
  
  while(1);
}


使用特权

评论回复
panxiaoyi|  楼主 | 2021-10-13 21:48 | 显示全部楼层
本帖最后由 panxiaoyi 于 2021-10-14 15:48 编辑

更正了上面的图片标注

使用特权

评论回复
panxiaoyi|  楼主 | 2021-10-14 16:16 | 显示全部楼层
本帖最后由 panxiaoyi 于 2021-11-8 14:50 编辑
#include "PID.h"

short PID(U16 gap, U8 Kp, U8 Ki, U8 Kd)                 //增量式PID (误差,比例P,积分I,微分D)
{
  short static eK, eK1, eK2;
  
  eK2=eK1;
  eK1=eK;
  eK=gap;
  
  return (Kp*eK + Ki*(eK-eK1) + Kd*(eK-eK1-eK1+eK2));   //Kp*(本次-上次)+Ki*本次+Kd*[(本次-上次)-(上次-上上次)]
}

//-----------------------------------------------

short PID2(U16 gap, U8 Kp, U8 Ki, U8 Kd)                //不同的控制不能共用PID函数(因为它含有静态变量)
{
  short static eK, eK1, eK2;
  
  eK2=eK1;
  eK1=eK;
  eK=gap;
  
  return (Kp*eK + Ki*(eK-eK1) + Kd*(eK-eK1-eK1+eK2));
}

使用特权

评论回复
panxiaoyi|  楼主 | 2021-11-8 14:54 | 显示全部楼层
下载附件解压缩就可以看到磁悬浮的视频了
微信图片_20211108144957.jpg

磁悬浮视频.rar

2.75 MB,

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则