智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 82769|回复: 173
打印 上一主题 下一主题

[电机与驱动] 开源自己的MOS管电机驱动(PCB+原理图)有需要的可以看看

    [复制链接]

1

主题

93

帖子

0

精华

元老在此

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
72756
QQ
威望
58680
贡献
13246
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
跳转到指定楼层
1#
发表于 2015-8-9 01:12:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
首先得向大家说抱歉,说要给大家开源的,一直都没及时兑现,好在今晚可以兑现我的承诺了,我的前一个帖子:http://www.znczz.com/forum.php?mod=viewthread&tid=233099&fromuid=126125 上面说了一些板子的情况,有兴趣的可以去看看。当初发帖时板子刚画好,没有测试。最后打板回来测试可以使用,并且我用它来驱动四个电磁线圈做了一个上推式磁悬浮,看看能不能找几张图给大家看看。这个是PCB效果图                                                        

        这是磁悬浮的机械结构

                                                   

这个是驱动板的实物图,它其实很小块的:

                                                            

       稳定悬浮:

                                                            

              让它顶个纸杯,继续悬浮(虽然是第二次发帖了,还是不会用论坛的排版,弄的好费劲的,都编辑了好几次了。)

                                                            

       由于PCB带有3D封装,文件超过10M了,不能上传附件,我给出360云盘分享地址:http://yunpan.cn/cdrjp2ESK8J5K  访问密码 d63e,(PCB),原理图的分享地址和密码:http://yunpan.cn/cdrwfL7VutayY  访问密码 8f30。我把磁悬浮的视频也给大家分享下吧,姑且当做是对本驱动板的测试视频吧,这个主控板是XS128,调好后会很稳定的。这个是视频:原理图附件: 网速太太不给力了,竟然搞到凌晨一点多了,好多图片和附件都上传不上来,只能以后在传了,PCB就到360网盘去下载吧。














补充内容 (2016-8-18 13:38):
58楼,贴出了磁悬浮代码,但当初写得很简单,都不好意思贴上来了

补充内容 (2016-11-7 13:29):
由于360云盘分享连接失效了,我把PCB文件放到了66楼,需要的可以去下载哦

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

1

查看全部评分

回复

使用道具 举报

0

主题

770

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
9280
威望
5224
贡献
3388
兑换币
3559
注册时间
2016-9-1
在线时间
334 小时
毕业学校
西南某校
推荐
发表于 2016-11-5 13:01:21 | 只看该作者

谢谢楼主了
回复 支持 2 反对 0

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
72756
QQ
威望
58680
贡献
13246
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
推荐
 楼主| 发表于 2016-8-18 13:34:57 | 只看该作者
磁悬浮代码在此,代码写得不是很好,很简单,仅供参考。

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "OLED12864.h"

#define LL  PWMDTY23  
#define LH  PWMDTY01
#define RL  PWMDTY45
#define RH  PWMDTY67


#define N 12

uint valuex_buf[N]; //浮子位置采集数组
uint valuey_buf[N];
char i=0,i_y=0;


uint ADx_value,ADy_value;

int NET=0;

float A=0,B=0;
float AD_X,AD_Y;


float E_AD_X,E1_AD_X,E_AD_Y,E1_AD_Y;

float P_x =0.8;
float D_x =15.5;
float P_y =-0.8;
float D_y =-15;

float pwm_x,pwm_y;
//float Pwm_x = -300,Pwm_y = -300;


float SET_AD_X = 1400;
float SET_AD_Y = 1370;



//**************************************************
//******      设置主频                       *******
//**************************************************
void Busclock(void)   //05,01 48MHz  06,01 56MHz  07,01 64MHz  08,01 72MHz  
{   
   CLKSEL = 0x00;//初始化PLL前先使用外部晶振       
   PLLCTL_PLLON = 1;//开启PLL               
   SYNR = 0xC0 | 0x08;                        
   REFDV = 0xC0 | 0x01;
   POSTDIV = 0x00;     
   _asm(nop);         
   _asm(nop);
   while(!(CRGFLG_LOCK==1));//等待PLL稳定          
   CLKSEL_PLLSEL = 1;        //fbus采用根据PLL频率设定             
}




//****************定时器初始化********************************
void initPIT()//定时中断初始化函数1MS 定时中断设置
{
  PITCFLMT_PITE=0; //定时中断通道0 关
  PITCE_PCE0=1;//定时器通道0 使能
  PITMTLD0=64-1;//8 位定时器初值设定。240 分频,在24MHzBusClock 下,为0.1MHz 1us
  PITLD0= 1000;//16 位定时器初值设定。PITTIME*0.01MS 1000*0.001=1ms
  PITINTE_PINTE0=1;//定时器中断通道0 中断使能
  PITCFLMT_PITE=1;//定时器通道0 使能
}

//************************************************************
//******************12位AD初始化******************************
//************************************************************               
void int_ad()   //AD初始化,12位精度
{
    ATD0DIEN = 0;           
    ATD0CTL1 = 0x50;                              
    ATD0CTL2 = 0x40;      
    ATD0CTL3 = 0xb0;     
    ATD0CTL4 = 0x29;     
    ATD0CTL5 = 0x30;      
}

//***************读出AD值**********************
void get_ad()  //读取AD值,数值放在数组中,用于中值滤波
{

    while(ATD0STAT0&0X80!=1);
     ADx_value=ATD0DR2;
     ADy_value=ATD0DR3;

}



//---------------------------PWM初始化---------------------------------------
  void PWM_speed_Init(void)
{
      PWME_PWME1=0;         //禁止
      PWME_PWME3=0;         
      PWMPRCLK=0x22;        //64/4=16MHz //72/4=18MHZ
      PWMCLK_PCLK1=0;       //设A为其时钟源
      PWMCLK_PCLK3=0;        //B为其时钟源
      PWMPOL_PPOL1=1;       //上升沿翻转
      PWMCAE_CAE1=0;        //左对齐输出
      PWMPOL_PPOL3=1;       //上升沿翻转
      PWMCAE_CAE3=0;        //左对齐输出
      PWMCTL_CON01=1;       //0,1级连方式
      PWMCTL_CON23=1;       //2,3级连方式
      PWMDTY01=0;            //初始化占空比为0的波形
      PWMDTY23=0;
      PWMPER01=1600;          //输出为10KHz的波
      PWMPER23=1600;  
      PWMCNT01=0x00;         //2通道计数器清0
      PWMCNT23=0x00;         //3通道计数器清零
      PWME_PWME1=1;         //2通道使能,2通道为输出通道
      PWME_PWME3=1;         // 3使能
}

  void PWM_speed_Init_1(void)
{
      PWME_PWME5=0;         //禁止
      PWME_PWME7=0;         
      PWMPRCLK=0x22;        //64/4=16MHz /72/4=18MHZ
      PWMCLK_PCLK5=0;       //设A为其时钟源
      PWMCLK_PCLK7=0;       //B为其时钟源
      PWMPOL_PPOL5=1;       //上升沿翻转
      PWMCAE_CAE5=0;        //左对齐输出
      PWMPOL_PPOL7=1;       //上升沿翻转
      PWMCAE_CAE7=0;        //左对齐输出
      PWMCTL_CON45=1;       //0,1级连方式
      PWMCTL_CON67=1;       //2,3级连方式
      PWMDTY45=0;            //初始化占空比为0的波形
      PWMDTY67=0;
      PWMPER45=1600;         //输出为10KHz的波
      PWMPER67=1600;  
      PWMCNT45=0x00;         //2通道计数器清0
      PWMCNT67=0x00;         //3通道计数器清零
      PWME_PWME5=1;          //2通道使能,2通道为输出通道
      PWME_PWME7=1;          // 3使能
}


//--------------------PWM输出函数------------------------------
void speed(float Left,float Right )
{
  if(Left>0)
  {
  LL = 0; LH = Left+B;
  }
  if(Left<0)
  {
  LL = -Left+B;LH = 0;
  }
  if(Left==0)
  {
   LL = 0; LH = 0;
  }
  if(Right==0)
  {
   RL = 0;RH = 0;
  }
  if(Right>0)
  {
   RL = 0;RH = Right+A;
  }
  if(Right<0)
  {
   RL = -Right+A;RH = 0;
  }
}


/***************************************************
*******          延时函数                       ****
****************************************************/
void delay(uchar t)
{
uchar a;
for(a=0;a<t;a++);
}

void delaychang(uchar t)
{
uchar a,b;
for(a=0;a<t;a++)
   for(b=0;b<1000;b++);
}
//延时函数
void delay_OLED(char mxs)
{
  char yy,zz,bb;
  for(yy=mxs;yy>0;yy--)
    for(zz=253;zz>0;zz--)
      for(bb=252;bb>0;bb--);
}





//----------------------------
//---------N阶滑动滤波程序-----
//-----------------------------

float filter_x()
  {
    float sum=0;
    char count;
    valuex_buf[i++]=ADx_value;
    if(i==N) i=0;
     for(count=0;count<N;count++)
        sum=sum+valuex_buf[count];
     return sum/N;
  }


float filter_y()
  {
    float sum=0;
    char count;
    valuey_buf[i_y++]=ADy_value;
    if(i_y==N) i_y=0;
     for(count=0;count<N;count++)
        sum=sum+valuey_buf[count];
     return sum/N;
  }





/****************************************************
*******           I/O 初始化                     ****
****************************************************/
void Init_IO(void)
{
    DDRB=0xff;//PB6、PB5输出,,,0b01111110 = 0x7E,外部计数器清零、LED
    DDRA=0x00;//PA口采集外部计数器CD4520的值 外16位计数器低八位
    DDRM=0x00;//PM口采集高八位
    DDRH=0x00;

}


//-------------------带参数显示函数----------------
  void xianshi_LCD(int a,int b,int c)
    {
      switch(c)
        {
        case 0CD_P8x16Str(a,b,"0");break;
        case 1:LCD_P8x16Str(a,b,"1");break;
        case 2:LCD_P8x16Str(a,b,"2");break;
        case 3:LCD_P8x16Str(a,b,"3");break;
        case 4:LCD_P8x16Str(a,b,"4");break;
        case 5:LCD_P8x16Str(a,b,"5");break;
        case 6:LCD_P8x16Str(a,b,"6");break;
        case 7:LCD_P8x16Str(a,b,"7");break;
        case 8:LCD_P8x16Str(a,b,"8");break;
        case 9:LCD_P8x16Str(a,b,"9");break;
        }
    }



void dispiay()
  {
     int bai=0;
     int shi=0;
     int ge1=0;
     int bai1=0;
     int shi1=0;
     int ge=0;


    if(ADy_value>=1000)
    {

      xianshi_LCD(30,0,((int)ADy_value)/1000);
      bai=((int)ADy_value)%1000;
      xianshi_LCD(40,0,bai/100);
      shi=bai%100;
      xianshi_LCD(50,0,shi/10);
      ge=shi%10;
      xianshi_LCD(60,0,ge);
    }

    if(ADy_value>=100 && ADy_value<1000)
    {
      xianshi_LCD(30,0,0);
      xianshi_LCD(40,0,ADy_value/100);
      shi=ADy_value%100;
      xianshi_LCD(50,0,shi/10);
      ge=shi%10;
      xianshi_LCD(60,0,ge);
    }
    if(ADy_value<100)
    {
      xianshi_LCD(30,0,0);
      xianshi_LCD(40,0,0);
      xianshi_LCD(50,0,ADy_value/10);
      ge=ADy_value%10;
      xianshi_LCD(60,0,ge);
    }


    if(ADx_value>=1000)
    {

      xianshi_LCD(30,2,((int)ADx_value)/1000);
      bai1=((int)ADx_value)%1000;
      xianshi_LCD(40,2,bai1/100);
      shi1=bai1%100;
      xianshi_LCD(50,2,shi1/10);
      ge1=shi1%10;
      xianshi_LCD(60,2,ge1);
    }

    if(ADx_value>=100 && ADx_value<1000)
    {
      xianshi_LCD(30,2,0);
      xianshi_LCD(40,2,ADx_value/100);
      shi1=ADx_value%100;
      xianshi_LCD(50,2,shi1/10);
      ge1=shi1%10;
      xianshi_LCD(60,2,ge1);
    }
    if(ADx_value<100)
    {
      xianshi_LCD(30,2,0);
      xianshi_LCD(40,2,0);
      xianshi_LCD(50,2,ADx_value/10);
      ge1=ADx_value%10;
      xianshi_LCD(60,2,ge1);
    }

  }


  //********闭环控制PID*********************************************

void AD_X_pid()  //X方向PID调节
{
  E_AD_X=AD_X-SET_AD_X;
  pwm_x = P_x * E_AD_X + D_x * (E_AD_X - E1_AD_X);
  if(pwm_x>=1550)  pwm_x = 1550;
  if(pwm_x<=-1550)  pwm_x =-1550;
  E1_AD_X = E_AD_X;
}

  void AD_Y_pid()    //Y方向PID调节
{
  E_AD_Y=AD_Y-SET_AD_Y;
  pwm_y = P_y * E_AD_Y + D_y * (E_AD_Y - E1_AD_Y);
if(pwm_y>=1550)   pwm_y = 1550;
if(pwm_y<=-1550)  pwm_y =-1550;
  E1_AD_Y = E_AD_Y;
}



void main(void)
{
     Busclock();   
     Init_IO();
     int_ad();
     initPIT();
     get_ad();
     PWM_speed_Init();
     PWM_speed_Init_1();
     LCD_Init();
            EnableInterrupts;


  for(;;)
   {  
   delay_OLED(250);   
   dispiay();
   LCD_P8x16Str(10,0,"X:");
   LCD_P8x16Str(10,2,"Y:");
   delay_OLED(250);



  _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /*please make sure that you never leave main */
}



#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{

NET++;
if(NET==1)
  {
  get_ad();
  AD_Y=filter_y();
  AD_X=filter_x();

  AD_X_pid();
  AD_Y_pid();

  speed(pwm_y,pwm_x);
  //eed(Pwm_x,Pwm_y);   
    NET=0;
  }
   PITTF_PTF0=1;//中断清零标志
}
#pragma CODE_SEG __NEAR_SEG DEFAULT


回复 支持 1 反对 0

使用道具 举报

5

主题

117

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4795
威望
2150
贡献
1733
兑换币
1442
注册时间
2013-8-7
在线时间
456 小时
推荐
发表于 2015-10-31 10:09:46 | 只看该作者
这么好的帖子居然沉了。悬浮装置挺不错的!
回复 支持 1 反对 0

使用道具 举报

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
威望
217
贡献
125
兑换币
130
注册时间
2016-3-8
在线时间
35 小时
毕业学校
安徽工程大学
推荐
发表于 2016-11-11 21:16:27 | 只看该作者
楼主可以分享一下原理图库么,PCB库画好了,原理图库画的太丑
回复 支持 1 反对 0

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
72756
QQ
威望
58680
贡献
13246
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
175#
 楼主| 发表于 2021-8-11 09:21:41 | 只看该作者
舒暢 发表于 2020-7-21 13:51
楼主 , 原理图 还在不在?

原理图在帖子的正文,仔细找一下。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
13
威望
9
贡献
4
兑换币
3
注册时间
2020-7-21
在线时间
0 小时
174#
发表于 2020-7-21 13:51:32 | 只看该作者
楼主 , 原理图 还在不在?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
42
威望
26
贡献
16
兑换币
18
注册时间
2020-1-12
在线时间
0 小时
173#
发表于 2020-2-5 23:35:24 | 只看该作者
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
72756
QQ
威望
58680
贡献
13246
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
172#
 楼主| 发表于 2019-9-30 11:18:15 | 只看该作者
南汐寒笙 发表于 2019-6-3 21:52
请问楼主,可不可以加12v的电源供电呢?如果不能的话电源的电压范围是多少啊?

可以
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
120
威望
67
贡献
41
兑换币
45
注册时间
2019-4-6
在线时间
6 小时
171#
发表于 2019-6-3 21:52:32 | 只看该作者
请问楼主,可不可以加12v的电源供电呢?如果不能的话电源的电压范围是多少啊?
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

高级会员

Rank: 4

积分
972
威望
565
贡献
355
兑换币
369
注册时间
2017-11-19
在线时间
26 小时
170#
发表于 2019-3-18 13:35:45 | 只看该作者
楼主, 我仿照你这个画了一个,电感用的330uh的,但是跑了几圈电感下面的那条地线爆皮了,主板上的电源线爆皮了,是不是地线有点细的原因
回复 支持 反对

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
72756
QQ
威望
58680
贡献
13246
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
169#
 楼主| 发表于 2019-3-11 11:34:16 | 只看该作者
流云坠 发表于 2019-2-23 16:02
大佬,我是小白,所以请问一下那个输入接口pwm1-4旁边GND是空出来的吗?如果要接,这个GND应该接哪里?

这个GND是不同电源信号共地点,智能车只用一块电池,不存在共地问题,所以你可以不用接。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
53
威望
30
贡献
15
兑换币
15
注册时间
2018-11-25
在线时间
4 小时
168#
发表于 2019-3-5 13:57:32 | 只看该作者
通电后所有的小灯都是好使的吗
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
53
威望
30
贡献
15
兑换币
15
注册时间
2018-11-25
在线时间
4 小时
167#
发表于 2019-3-5 13:53:13 | 只看该作者
zero的 发表于 2019-3-5 13:52
通电后所有的小灯都是亮的吗

用于智能车好使吗

回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 16:34 , Processed in 0.089258 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表