公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

E-Power TLE9879开发板评测心得纪要

lock attach
Attachments are accessible only for community members.

E-Power TLE9879开发板评测心得纪要

Qinglong
Level 1
Level 1
100 sign-ins 50 sign-ins 25 sign-ins

                                                      【TLE9879 Evaluation Kit】评测心得纪要

      收到开发板已有段时间了,可能是由于第一次接触英飞凌的开发板的缘故,尤其是驱动这类工业级电机,感觉没有开发经验,此评估板是带三相输出,控制直流电机转速的,就我目前开发的智能门锁项目,用的是普通的5V直流电机,没有涉及到三相输出控制电机。

      TLE9879 Evaluation Kit与TLE9869 Evaluation Kit相比较,TLE9879 Evaluation Kit多出一相输出控制电机运转。收到开发板套件的时候,外面的包装如下图所示:

 外盒包装.jpg

      然后拆开包装盒,里面有我们使用的TLE9879核心开发板,还附带一个4G的优盘和一个USB转mini头的数据线,还有一张以英文编写的说明卡片,如下图所示:

 全部组件.jpg

 

      再近距离看一下TLE9879核心板的硬件布局。这块板看上去没有多宽大,但实际拿在手中感觉挺重,板层挺厚实的。该电源驱动模块功能强大,支持最大输入电压28V,最大输入电流20A,有LIN主从通讯接口,8盏LED指示灯能够供用户进行控制状态信息交互,两个按键触发事件,支持JLINK在线调试。该开发板中还提供了许多Test Points,方便开发人员通过对比测量值,进行问题精准定位。唯一不足的是后底板的四个透明胶垫的高度未高于底板PCB上的保留元器件的管脚,因此依然存在短路隐患。

 核心主板.jpg

     关于TLE9879的整体框架,套件中附带的说明图纸如下,说明文档中也做了比较详细的讲解,这里就不再细说。

 主体原理图.jpg

     TLE9879支持三相N-MOS型输出,电路原理图详情如下:

 图片01.png

 

     在粗略的了解了该开发套件的资料后,然后根据操作说明文档进行调试项目程序。本次进行评测的内容正是当初申请该开发套件时计划达成的温控项目。该温控项目的具体实现过程如下所述,将兆易创新的GD32F350开发板作为温度采集处理的核心板,DS18B20通过单线式通信协议与GD32F350进行温度数值的传递,同时PA2作为串口TX端,PA3作为串口RX端与PC串口调试助手相连接,将实时温度值显示在串口调试助手的接收信息窗口中。当采集到的温度值大于某个限定值时将PC6管脚输出高电平,同时板上LED灯加速亮灭频率;另一方面在TLE9879开发板中不断的监测P1.2管脚的电平变化,如果为高电平则启动电机,同时P0.1口的LED1以一定频率闪烁。其实这好比我们使用的笔记本散热器,能够通过检测CPU的工作实时温度变化,自动启动或关闭风扇。

     虽然说此次的项目功能简单,完成时间也比较短,但更多的时间是用在熟悉电机的驱动使用,在此之前,我接触的智能门锁都是采用有刷直流电机,而且电压最大也就采用9V电池供电,此次英飞凌的TLE9879让我接触到了无刷直流电机的驱动,而且是支持三相直流电机。TLE9879QXA40是采用ARMCortex-M3内核,第三代嵌入式电源集成电路,适用于智能三相无刷直流电机的各种控制应用,可通过B6桥配置中的MOSFETS,直接连接到无刷直流电机,支持英飞凌的配置工具IFXConfigWizard,这个软件U盘中也提供了,也可以在英飞凌官网上下载最新版的。它能对程序底层做用户自定义的配置,除去了人工敲代码的繁琐,方便快速开发产品。

   根据用户操作指南手册,我们将很容易得让电机运转起来,当然是建立在使用官方提供的Keil示例。我们可通过英飞凌官网找到支持Keil的pack包,即“Infineon.TLE987x_DFP.1.4.4.pack”,然后安装在Keil软件的安装目录,或者直接在Keil的Pack Installer界面下的File菜单中Import导入下载好的pack包,导入完毕后右边会出现Examples,如下所示,这里建议大家下载离线pack包,因为在线下载速度很慢,容易失败。这里分享一下pack包资源,有需要的网友可以自行下载。

链接:https://pan.baidu.com/s/19uRXVsNAO7XWFtgm-8Ukuw 

提取码:tpa7 

 Keil示例拷贝.png

      我们将无刷直流电机FOC(磁场导向控制)实现方式工程拷贝到自己设定的目录下,然后进入BLDC_SENSORLESS_FOC_EXAMPLE_TLE987X目录下,用Keil5打开工程,执行全编译后零错误零告警。

 零错误零告警.png

     接下来将编译好的程序下载至开发中,此时必须保证电池有供电,否则不能识别到Jlink下载接口。

 显示Jlink下载接口.png

     下载完成后,在板卡上按一下RESET按键,连接到板卡上的电机就运转起来了。刚开始采用鳄鱼夹上电,电源适配器也是12V/3A的,但下载成功后始终启动不了电机,然后直接取下鳄鱼夹,直接用剥了皮的电源线接入电源插孔,结果电机转动了,说明是由于鳄鱼夹耗掉的电流太大了,为此专门在淘宝店铺买了两个香蕉头。TLE9879支持三相直流电机驱动,如果采用普通的两线式有刷直流电机也是可以驱动的,为了演示方便,在京东上买了个三线式无刷直流航模电机。在原来拷贝出的工程中添加与GD32F350相通信的代码,即不断检测P1.2口是否为高。为高则说明温度过高,应当启动电机,LED1闪烁提醒用户。

     演示的视频链接如下:

英飞凌TLE9879套件介绍https://v.youku.com/v_show/id_XNDQ5NjQ5MDY3Ng==.html

英飞凌TLE9879代码略读https://v.youku.com/v_show/id_XNDQ5NjQ4Njk0NA==.html

英飞凌TLE9879操作视频演示https://v.youku.com/v_show/id_XNDQ5NjQ4MTkxMg==.html

 

//////////////////********TLE9879工程部分源码************////////////////

uint8_t Recv_GD32F350(void)

 {

      ch = PORT_ReadPin(0x12);

  return ch;

 }

 

static void Main_lStartMotor(void)

{

  uint32 Error;

PORT_ChangePin(LED1, PORT_ACTION_OUTPUT);

i++;

if (i > 15625)

{

PORT_ChangePin(LED1, PORT_ACTION_INPUT);

}

if (i > 31250)

{

PORT_ChangePin(LED1, PORT_ACTION_INPUT);

i=0;

}

  Error = EMO_ERROR_NONE;

  if(Error == EMO_ERROR_NONE)

  {

    Error = Emo_StartMotor((uint32)1u);

  }

  if(Error == EMO_ERROR_NONE)

  {

__nop();

  }  

  else   

  {

    __nop();

  }  

}

 

void Poti_Handler(void)

{

uint16 mV;

 if (i < 250000)

    {

      PORT_ChangePin(LED1, PORT_ACTION_TOGGLE);

     }

/* read the value at Ch4 (Poti) in mV

  values between 0 and 5000 are possible */

if(ch == 0x01)

{

if (ADC1_GetChResult_mV(&mV, ADC1_CH4) == true )

{

      Emo_setspeedreferenz(mV );

Main_lStartMotor();

 

      if (mV > 1000)

      {

        Main_lStartMotor();

      }

      else if(mV < 800)

      {

        Main_lStopMotor();

      }

      else

      {

      }

    }

}

if(ch == 0x00)

{

Main_lStopMotor();

}

}

 

//////////////////******** GD32F350工程部分源码************////////////////

void GPIO_Init(uint32_t gpio_periph,GPIO_InitPara *Para)

{

    rcu_periph_clock_enable(RCU_GPIOB);

   

    rcu_periph_clock_enable(RCU_GPIOB);

    GPIO_BOP(gpio_periph) = Para->GPIO_Pin;

    GPIO_OSPD0(gpio_periph) = Para->GPIO_Speed;

    GPIO_OMODE(gpio_periph) = Para->GPIO_Mode;

    GPIO_BC(gpio_periph) = Para->GPIO_Pin;

}

 

void TempGPIOInit(void)

{

rcu_periph_clock_enable(RCU_GPIOB);

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;

GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

 

void TempGPIOin(void)

{

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;

GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

 

void TempGPIOout(void)

{

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;

GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

static void ds18b20_write8(unsigned char data)   

{         

    int i;

 gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);

       for (i = 0; i < 8; i++) {

                if ((data & 0x1) == 1) {

                        gpio_bit_reset(GPIOB, GPIO_PIN_12);

                        delayus(3);

                        gpio_bit_set(GPIOB, GPIO_PIN_12);

                        delayus(80);

                } else {

                        gpio_bit_reset(GPIOB, GPIO_PIN_12);

                        delayus(80);

                        gpio_bit_set(GPIOB, GPIO_PIN_12);

                        delayus(3);

                }

                data >>= 1;

       }

}

 

static unsigned char ds18b20_read8(void)     

{          

        int i;

        unsigned char bit;

        unsigned char data = 0;

        

        for (i = 0; i < 8; i++) {     

    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);

           gpio_bit_reset(GPIOB, GPIO_PIN_12);

           delayus(2);

    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_12);

           bit = gpio_input_bit_get(GPIOB, GPIO_PIN_12);

           data |= (bit << i);

           delayus(60);

        }

        return data;

}

 

static float ds18b20_read()

{

        int temp = 0;

     int minus;

        char temp1,temp2;

        ds18b20_reset();     

        ds18b20_write8(DS18B20_SKIP_ROM);  

        ds18b20_write8(DS18B20_COVERTT);    

     delayus(125);      

        ds18b20_reset();     

        ds18b20_write8(DS18B20_SKIP_ROM);   

        ds18b20_write8(DS18B20_READ_MEM);           

        temp1 = ds18b20_read8();

        temp2 = ds18b20_read8();

 

if(temp2&0xfc)

{

minus=1;

temp=((temp2<<8)|temp1);

temp=((~temp)+1);

}

else

{

minus=0;

temp=((temp2<<8)|temp1);

}

temp=(float)temp*0.0625;

if(minus==1)

{

temp=-temp;

}

return temp;

}

 

int ds18b20_main(void)

{

  float  data;

  systick_config();

     TempGPIOInit();

  data = ds18b20_read();

  EvbUart1Printf("Temperature:%2.2f?? ",data);

     if(data==0)

{

EvbUart1WriteByte('1');

return 0;

  }else if(((data<10)&&(data!=0))||(data>25))

{

EvbUart1WriteByte('2');

  return -1;

  }else

{

EvbUart1WriteByte('3');

return 1;

}

}

 

    简要的绘制了一下GD32F350与TLE9879开发板的连接示意图如下

 连线示意图.png

     经过此次TLE9879开发板的练习,也让我初步了解了有刷电机与无刷电机的实质性的区别,简要的概述如下:

 有刷电机工作原理.gif

     有刷电机的主要结构就是定子+转子+电刷,通过旋转磁场获得转动力矩,从而输出动能。电刷与换向器不断接触摩擦,在转动中起到导电和换相作用。有刷电机采用机械换向,磁极不动,线圈旋转。电机工作时,线圈和换向器旋转,磁钢和碳刷不转,线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

 无刷电机工作原理.gif

     无刷电机中,换相的工作交由控制器中的控制电路(一般为霍尔传感器+控制器,更先进的技术是磁编码器)来完成。无刷电机采取电子换向,线圈不动,磁极旋转。无刷电机,是使用一套电子设备,通过霍尔元件,感知永磁体磁极的位置,根据这种感知,使用电子线路,适时切换线圈中电流的方向,保证产生正确方向的磁力,来驱动电机,消除了有刷电机的缺点。

 


0 点赞
3809 次查看
10 评论