深港报二肖中特

智能车制作

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 42950|回复: 168
打印 上一主题 下一主题

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

    [复制链接]

1

主题

91

帖子

0

精华

元老在此

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

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

        这是磁悬浮的机?#21040;?#26500;

                                                   

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

                                                            

       稳定悬浮:

                                                            

              让它顶个?#22870;?#32487;续悬浮(虽然是第二次发帖了,还是?#25442;?#29992;论坛的排版,弄的好费劲的,都编辑了好?#22797;?#20102;。)

                                                            

       由于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

查看全部评分

分享到:  微信微信 QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏29 转播转播 分享分享 顶3 踩
回复

使用道具 举报

0

主题

770

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5530
威望
3010
贡献
1912
兑换币
2083
注册时间
2016-9-1
在线时间
304 小时
毕业学校
西南?#25215;?/dd>
推荐
发表于 2016-11-5 13:01:21 | 只看该作者

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

使用道具 举报

1

主题

91

帖子

0

精华

元老在此

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

积分
56563
QQ
威望
45298
贡献
10443
兑换币
1249
注册时间
2013-3-5
在线时间
411 小时
推荐
 楼主| 发表于 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 ?#21046;擔?#22312;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;        //左?#20113;?#36755;出
      PWMPOL_PPOL3=1;       //上升沿翻转
      PWMCAE_CAE3=0;        //左?#20113;?#36755;出
      PWMCTL_CON01=1;       //0,1?#35835;?#26041;式
      PWMCTL_CON23=1;       //2,3?#35835;?#26041;式
      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;        //左?#20113;?#36755;出
      PWMPOL_PPOL7=1;       //上升沿翻转
      PWMCAE_CAE7=0;        //左?#20113;?#36755;出
      PWMCTL_CON45=1;       //0,1?#35835;?#26041;式
      PWMCTL_CON67=1;       //2,3?#35835;?#26041;式
      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;

}


//-------------------带?#38382;?#26174;?#31454;?#25968;----------------
  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

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

使用道具 举报

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

37

主题

482

帖子

0

精华

元老在此

做智能车,首选泰庆!

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

积分
82166

活跃会员奖章优秀会员奖章资源大师奖章

QQ
威望
67488
贡献
14230
兑换币
687
注册时间
2015-7-19
在线时间
224 小时
毕业学校
泰庆电子
6#
发表于 2015-8-11 10:07:07 | 只看该作者
赞一个!
回复 支持 反对

使用道具 举报

4

主题

429

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4063

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

QQ
威望
1892
贡献
1233
兑换币
1210
注册时间
2014-11-9
在线时间
469 小时
7#
发表于 2015-8-16 08:05:49 | 只看该作者
这块驱动?#20197;?#34013;宙看见啊
回复 支持 反对

使用道具 举报

3

主题

41

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
威望
626
贡献
390
兑换币
395
注册时间
2015-3-27
在线时间
111 小时
毕业学校
金华大学
8#
发表于 2015-8-16 10:02:31 | 只看该作者
谢谢楼主了
回复 支持 反对

使用道具 举报

1

主题

91

帖子

0

精华

元老在此

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

积分
56563
QQ
威望
45298
贡献
10443
兑换币
1249
注册时间
2013-3-5
在线时间
411 小时
9#
 楼主| 发表于 2015-8-16 14:19:25 | 只看该作者
︶▔丶沉醉 发表于 2015-8-16 08:05
这块驱动?#20197;?#34013;宙看见啊

电路是一样的
回复 支持 反对

使用道具 举报

1

主题

91

帖子

0

精华

元老在此

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

积分
56563
QQ
威望
45298
贡献
10443
兑换币
1249
注册时间
2013-3-5
在线时间
411 小时
10#
 楼主| 发表于 2015-8-16 14:26:50 | 只看该作者

回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
57
威望
31
贡献
18
兑换币
17
注册时间
2014-7-17
在线时间
4 小时
毕业学校
161中学
11#
发表于 2015-8-20 01:41:28 | 只看该作者
挺漂亮的驱动,另外这个驱动也是不能满占空比的吧?
回复 支持 反对

使用道具 举报

1

主题

91

帖子

0

精华

元老在此

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

积分
56563
QQ
威望
45298
贡献
10443
兑换币
1249
注册时间
2013-3-5
在线时间
411 小时
12#
 楼主| 发表于 2015-8-21 00:41:42 | 只看该作者
a208hlc 发表于 2015-8-20 01:41
挺漂亮的驱动,另外这个驱动也是不能满占空比的吧?

应该可以的呀,不过没试过满占空比的情况
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
威望
522
贡献
306
兑换币
337
注册时间
2013-12-26
在线时间
96 小时
毕业学校
饶平二中
13#
发表于 2015-10-22 10:36:53 | 只看该作者
66666
回复 支持 反对

使用道具 举报

您需要登?#24049;?#25165;可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 京ICP备14023231号-8

GMT+8, 2019-3-20 19:43 , Processed in 0.413186 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
深港报二肖中特