搜索

[STM32] STM8单片机控制 磁悬浮 半成品 请教

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

STM8单片机控制 磁悬浮 半成品 请教

如图:a 、b 是线性霍尔传感器 49E,经LMV358简易差分放大,工作电压都是5V,STM8也是5V
49E输出电压静态时约2.5V,经放大,实测放大18倍,放大输出中点约2.5V,工作时放大器输出的电压约 2.5V + - 3%
电磁铁 A1、A2 串联,当A1吸时,A2就推,软件控制可正反工作,B1、B2 也是一样
A1 A2轴由霍尔a提供信号,B1 B2轴由霍尔b提供信号
程序计数溢出才中断
进入中断后立刻检测a或者b信号,然后调整和输出单次脉冲(正脉冲 或者 负脉冲),驱动A1A2或者B1B2,同时中断结束。 脉冲驱动的H桥电路是L298N,再驱动电磁铁
脉冲消失后定时器继续计数到溢出才中断,中断时,由于剩磁基本消失,因此检测a或者b的信号受到的干扰比较小
程序每秒中断1000次,第一次中断调整A1A2轴,第二次中断调整B1B2轴,如此循环
之前是每次中断时,程序同时检测调整A1A2 B1B2轴脉冲,但是,我感觉这样的电磁力学太复杂了,调试失败
但是,现在还是调试不成功
断开A1A2或者B1B2电磁铁电流,单纯调试任意A1A2或者B1B2路,浮子有调整手感,有向中心推的力量
但是,全工作时,调整就是不成功

请教,请有成功的或者有电磁力学的指导一下,也请大家指导一下,谢谢





微信图片_20211013212448.jpg
磁悬浮01.PNG

STM8S105 磁悬浮.rar

587.9 KB, 下载次数: 1

使用特权

评论回复

相关帖子

panxiaoyi|  楼主 | 2021-10-13 21:39 | 显示全部楼层
本帖最后由 panxiaoyi 于 2021-10-14 15:45 编辑

https://bbs.21ic.com/icview-3069754-1-1.html
这个是我用AVR ATtiny13做的简单的上拉式磁悬浮,可以正常工作
但是,这个下推式就是调试不成功,我认真检查了,除了计算调整算法,估计硬件和软件都没有bug
H桥供电 12V
估计是电磁力学这里,自己的水平还太菜,也使用过 PID 控制,但是,都不行,现在都不知道要修改哪里?

使用特权

评论回复
panxiaoyi|  楼主 | 2021-10-13 21:41 | 显示全部楼层
源代码

//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"

#define ADC4 517                                        //南北
#define ADC5 529                                        //东西
#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)
{
  if(i)                                                 //读取调整A组
  {
    ADC_Start(4);
    adc_dat=ADC_Read();
    gap=adc_dat-ADC4;
    amend=gap;
    amend*=amend;
    amend*=4;
   
    if(gap>0)
    {
      TIM3_CH1_OutOnePulse(1,amend);                    //输出H电平的调整单脉冲
      HA_OUT=0;                                         //当脉冲输出H电平时,本配对要输出0电平来配对
    }
    else
    {
      TIM3_CH1_OutOnePulse(0,amend);                    //输出反相单脉冲
      HA_OUT=1;
    }
    printf("A %d  ",adc_dat);
  }
else //------------------------------------------      //读取调整B组
  {
    ADC_Start(5);
    adc_dat=ADC_Read();
    gap=adc_dat-ADC5;
    amend=gap;
    amend*=amend;
    amend*=4;
   
    if(gap>0)
    {
      TIM3_CH2_OutOnePulse(1,amend);                    //输出H电平的调整单脉冲
      HB_OUT=0;                                         //当脉冲输出H电平时,本配对要输出0电平来配对
    }
    else
    {
      TIM3_CH2_OutOnePulse(0,amend);                    //输出反相单脉冲
      HB_OUT=1;
    }
    printf("B %d\n",adc_dat);
  }

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

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

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

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

  while(1);
}


//STM8S105_IAR_V3.11
//本例由panxiaoyi(QQ68354248)原创,并在21ic.com首发,转载请保留,谢谢!
//设置自动重装载寄存器时,新写入的值可以立刻生效,也可以设置为有新的事件产生时才能生效。
//设置预分频寄存器时,新写入的值不会立刻生效,必须要等到有新的事件产生时才能生效。
//什么是事件产生呢?就是计数溢出,或者写1到事件产生寄存器的UG位。
//其实预分频寄存器和自动重装载寄存器都属于缓冲器,真正起作用的是它们背后的影子寄存器。
//事件产生时,这两个缓冲寄存器的值都会立刻更新到影子寄存器。
//计数器TIM1/2/3是16位,读写16位寄存器HL时,都是先读写H寄存器,再读写L寄存器
//单脉冲模式时,PWM按常规输出,只是计数器在溢出后返回到0时停止计数
//单脉冲模式时,请注意,如果选择PWM1/PWM2模式,则,计数溢出返回0时,比较还继续有效,输出电平还会发生变化

#include "TIME.h"

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

void IO_Init(void)
{
  PE_DDR_DDR5=1;                                        //设置PE5为输出驱动LED
  PE_CR1_C15=1;                                         //设置PE5为推挽输出
  PE_ODR_ODR5=0;                                        //输出HL电平
  
  PD_DDR_DDR3=1;                                        //配合TIM3_CH1驱动H桥A组电磁铁
  PD_DDR_DDR4=1;                                        //配合TIM3_CH2驱动H桥B组电磁铁
  PD_CR1_C13=1;
  PD_CR1_C14=1;
  PD_ODR_ODR3=0;                                        //默认输出L电平
  PD_ODR_ODR4=0;
}

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

void TIM3_OnePulseInit(void)                            //单脉冲模式
{
  CLK_PCKENR1 |= (1<<6);                                //先启动TIM3的系统供给时钟
  TIM3_CR1_ARPE=1;                                      //使能自动重装载的预装载(缓冲使能)
  TIM3_CR1_OPM=1;                                       //单脉冲模式(计数溢出/软件产生更新UG=1时,计数停止)
  TIM3_CR1_URS=1;                                       //更新时不中断, 推后到计数溢出时才中断
  TIM3_IER_UIE=1;                                       //使能更新事件中断
  TIM3_PSCR_PSC=0;                                      //预分频默认=1
  TIM3_ARRH=0x3E;                                       //设置预装载值(计数溢出点)
  TIM3_ARRL=0x80;                                       //计数器从0开始计数,0x3E80=16K,16M/16K=每秒计数溢出1000次
  TIM3_CCMR1_OC1M=0;                                    //冻结模式(输出不变化)
  TIM3_CCMR2_OC2M=0;                                    //通道2
  TIM3_CR1_CEN=1;                                       //计数使能,计数开始,
}

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

void TIM3_CH1_OutOnePulse(unsigned char HL, unsigned short width)               //输出单个脉冲(脉冲极性,脉冲宽度)
{
  unsigned short *p16=&width;
  unsigned char *p8=(unsigned char*)p16;                //拆分变量,使用指针比左右移高效
  
  TIM3_CCMR1_OC1M=0;                                    //冻结模式(冻结模式转到其它模式时,输出电平立即变化)
  if(HL)
  {
    TIM3_CCMR1_OC1M=5;                                  //强制输出高电平
    TIM3_CCMR1_OC1M=2;                                  //比较匹配时输出低电平
  }
  else
  {
    TIM3_CCMR1_OC1M=4;                                  //强制输出低电平
    TIM3_CCMR1_OC1M=1;                                  //比较匹配时输出高电平
  }
  
  TIM3_CCR1H=*p8;                                       //设置比较值,读写都是先H后L
  TIM3_CCR1L=*(p8+1);                                   //赋值后,该值会立刻和计数比较,即: 正或者负脉冲开始输出
  TIM3_CCER1_CC1E=1;                                    //输出使能
  TIM3_CR1_CEN=1;                                       //计数使能,计数开始
}

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

void TIM3_CH2_OutOnePulse(unsigned char HL, unsigned short width)               //输出单个脉冲(脉冲极性,脉冲宽度)
{
  unsigned short *p16=&width;
  unsigned char *p8=(unsigned char*)p16;                //拆分变量,使用指针比左右移高效
  
  TIM3_CCMR2_OC2M=0;                                    //冻结模式(冻结模式转到其它模式时,输出电平立即变化)
  if(HL)
  {
    TIM3_CCMR2_OC2M=5;                                  //强制输出高电平
    TIM3_CCMR2_OC2M=2;                                  //比较匹配时输出低电平
  }
  else
  {
    TIM3_CCMR2_OC2M=4;                                  //强制输出低电平
    TIM3_CCMR2_OC2M=1;                                  //比较匹配时输出高电平
  }
  
  TIM3_CCR2H=*p8;                                       //设置比较值,读写都是先H后L
  TIM3_CCR2L=*(p8+1);                                   //赋值后,该值会立刻和计数比较,即: 正或者负脉冲开始输出
  TIM3_CCER1_CC2E=1;                                    //输出使能
  TIM3_CR1_CEN=1;                                       //计数使能,计数开始
}

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

void TIM3_Off(void)
{
  TIM3_CCER1_CC1E=0;                                    //关闭输出
  TIM3_CR1_CEN=0;                                       //关闭计数
  CLK_PCKENR1 &= ~(1<<6);                               //关闭TIM3的系统供给时钟
}



STM8S105 磁悬浮.rar

587.9 KB, 下载次数: 4

使用特权

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

更正了上面的图片标注

使用特权

评论回复
panxiaoyi|  楼主 | 2021-10-14 16:16 | 显示全部楼层
放大部分如图,实测放大18倍,估计空载时皱纹电压不大,且手上没有0.1uf电容,不然的话并联在输出也许比较好

微信图片_20211014161543.jpg

使用特权

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

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 呐咯密密 得到打赏 ¥310.00
  • 2 qbwww 得到打赏 ¥265.00
  • 3 yanzhengxin1 得到打赏 ¥200.00
  • 4 full_stack 得到打赏 ¥100.00
  • 5 laocuo1142 得到打赏 ¥55.00
  • 6 zhangjiantao 得到打赏 ¥50.00
  • 7 小叶三千 得到打赏 ¥50.00
  • 8 cjseng 得到打赏 ¥50.00
  • 9 改名了 得到打赏 ¥30.00
  • 10 HXM1593 得到打赏 ¥15.00
在线客服 快速回复 返回顶部 返回列表