智能车制作

 找回密码
 注册

扫一扫,访问微社区

楼主: 翱翔九天
打印 上一主题 下一主题

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

    [复制链接]

1

主题

93

帖子

0

精华

元老在此

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

积分
72540
QQ
威望
58500
贡献
13210
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
51#
 楼主| 发表于 2016-5-12 09:34:11 | 只看该作者
灯火阑 发表于 2016-4-5 22:48
楼主不妨分享一下悬浮的代码

想要的话可以给大家
回复 支持 反对

使用道具 举报

4

主题

337

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1655
QQ
威望
859
贡献
474
兑换币
556
注册时间
2014-11-11
在线时间
161 小时
毕业学校
52#
发表于 2016-5-14 14:20:41 | 只看该作者
翱翔九天 发表于 2016-5-12 09:34
想要的话可以给大家

谢谢
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
125
威望
67
贡献
38
兑换币
40
注册时间
2015-10-23
在线时间
10 小时
毕业学校
常州大学
53#
发表于 2016-6-29 18:40:53 | 只看该作者
有做智能车的同学测试了吗?能用在智能车上吗
回复 支持 反对

使用道具 举报

4

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
911
威望
545
贡献
192
兑换币
350
注册时间
2016-6-24
在线时间
87 小时
54#
发表于 2016-7-21 13:08:08 | 只看该作者
楼主,我参考你的驱动画了一个,回来焊上后,发现升压降压和隔离都没问题,就是一接上IR2104S后电源部分就不正常了 本来5V可以升压到11.55V 接上IR2104S后变成0.8V??所有电压都不对了 然后把IR2104S拆了就是正常的电压了,是不是买的芯片的事,我对了好几遍线和封装都没问题,是不是芯片的事儿,求解
回复 支持 反对

使用道具 举报

4

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
848
威望
380
贡献
222
兑换币
249
注册时间
2016-1-6
在线时间
123 小时
55#
发表于 2016-7-25 10:38:35 | 只看该作者
楼主 下完后是 .php格式的,打不开,请问你是用什么软件下载的
回复 支持 反对

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

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

积分
72540
QQ
威望
58500
贡献
13210
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
56#
 楼主| 发表于 2016-8-15 09:42:29 | 只看该作者
Itchy 发表于 2016-7-21 13:08
楼主,我参考你的驱动画了一个,回来焊上后,发现升压降压和隔离都没问题,就是一接上IR2104S后电源部分就 ...

换一片新的IR2104试一下,可能是芯片问题。
回复 支持 反对

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

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

积分
72540
QQ
威望
58500
贡献
13210
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
57#
 楼主| 发表于 2016-8-15 09:45:38 | 只看该作者
wx_BL4TtiQi 发表于 2016-7-25 10:38
楼主 下完后是 .php格式的,打不开,请问你是用什么软件下载的

网盘下载的文件直接是PCB和原理图文件,我用AD09画的,你要用AD软件打开。
回复 支持 反对

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

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

积分
72540
QQ
威望
58500
贡献
13210
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
58#
 楼主| 发表于 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

使用道具 举报

1

主题

93

帖子

0

精华

元老在此

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

积分
72540
QQ
威望
58500
贡献
13210
兑换币
1351
注册时间
2013-3-5
在线时间
415 小时
59#
 楼主| 发表于 2016-8-18 13:39:00 | 只看该作者

代码在58楼
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
威望
146
贡献
75
兑换币
84
注册时间
2016-6-21
在线时间
24 小时
毕业学校
深职院
60#
发表于 2016-9-24 15:55:07 | 只看该作者
请问有没有PCB的封装库?求分享,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 11:01 , Processed in 0.098844 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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