公告

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

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

cross mob

【TLE9869】+ A8.板载电位器对电机调速

【TLE9869】+ A8.板载电位器对电机调速

limale
Level 1
Level 1
50 comments on blog 25 comments on blog 10 comments on blog

这周比较忙都没什么时间玩板子,趁着今天下雪刚好可以继续熟悉一下电机控制部分。先前的帖子只是按照官方的例程稍作改动让电机能转起来。不过在实际的应用中我们肯定要进行一些速度控制,今天我们就用板载的电位器对电机进行速度控制。

使用到的外设有UART、CCU6、BDRV和ADC1,相关的寄存器配置如下:

QQ截图20181208184643.jpg

QQ截图20181208184712.jpg

这里我们可以选择不从相应的管脚输出波形,便于用串口来打印信息。

QQ截图20181208184742.jpg

QQ截图20181208184804.jpg

QQ截图20181208184816.jpg

QQ截图20181208184839.jpg

生成相应的代码之后,我的思路是通过调节板载电位器来控制占空比来达到调速的目的。AD转换mV输出的范围是0-5000,通过(uint16)1200*mV/5000)可以映射到0-1200,对应的占空比是0-100。然后通过串口发送字符'a''b'可以进行电机的换向。

QQ截图20181208185732.jpg

main函数如下:

uint16 mV;

bool value_valid;

uint8 flag;


int main(void)

{

  /*****************************************************************************

  ** initialization of the hardware modules based on the configuration done   **

  ** by using the IFXConfigWizard                                             **

  *****************************************************************************/

SCU_Init();

Port_Init();  

CCU6_Init();  

Bdrv_Init();

UART2_Init();

INT_Init();

Adc1_Init();

VAREF_Enable();


/*****************************************************************************

  ** place your application code here                                         **

  *****************************************************************************/

  /* check open load at the motor contacts */

  if (Bdrv_Diag_OpenLoad() == true)

  {

    /* no motor detected */

printf(" 电机没有连接 ");

  }

  else

  {

    /* motor found */

printf(" 连接了一个电机 ");

//    /* configure bridge to run PWM on Phase2 - forward */

    Bdrv_Set_Bridge(Ch_En, Ch_On, Ch_PWM, Ch_PWM);


//    /* backward */

//    /* configure bridge to run PWM on Phase1 - backward */

//    Bdrv_Set_Bridge(Ch_PWM, Ch_PWM, Ch_En, Ch_On);

  }

printf("------------------------- ");

printf("Hi,this is a bdrv demo!!! ");

printf("------------------------- ");

  while (1)

{

    /***************************************************************************

    ** main watchdog1 (WDT1) service                                          **

    ***************************************************************************/

/*lint -e534 Supressing MISRA 2012 MISRA 2012 Directive 4.7 */

    WDT1_Service();

/*lint +e534 */


    /***************************************************************************

    ** place your application code here                                       **

    ***************************************************************************/

Delay_S(1000);

    value_valid = Adc1_GetChResult_mV(&mV, ADC1_CH4);

    if (value_valid == true)

    {

if(flag == 0)

printf("电机正转 |");

else

printf("电机反转 |");

printf(" AD转换电压(mV) = %d | 占空比(%%) = %2d " ,mV,(uint16)mV/50);

CCU6_LoadShadowRegister_CC60((uint16)1200*mV/5000);

CCU6_LoadShadowRegister_CC61((uint16)1200*mV/5000);

CCU6_EnableST_T12();

CCU6_StartTmr_T12();

    }

  }

}

void uart2_rx_callback(void){

if(UART2->SCON.bit.RI == 1){

UART2->SCONCLR.reg = UART_MASK_INT_RI;

if('a' == UART2->SBUF.reg){

// Port_ChangePin(LED7,PORT_ACTION_SET);

// printf("LED1 is ON ");

flag = 0;

Bdrv_Set_Bridge(Ch_En, Ch_On, Ch_PWM, Ch_PWM);

}

if('b' == UART2->SBUF.reg){

// Port_ChangePin(LED7,PORT_ACTION_CLEAR);

flag = 1;

Bdrv_Set_Bridge(Ch_PWM, Ch_PWM, Ch_En, Ch_On);

}

}

}

本来想通过lcd屏幕来显示相关信息的,但是调试中发现SSC1模块初始化没问题,只要一初始化lcd屏幕电机就不运行了卡在这里半天,还没找到具体的原因所以这里就通过串口来显示了,其实通过串口显示更方便一些不需要接额外的线。

QQ截图20181208191310.jpg

0 点赞
2249 次查看
5 评论