Funpack2-2: 基于TC275的呼吸灯设计
本设计是Funpack2-2英飞凌TC275单片机的任务2的实现:设计一个呼吸灯,通过旋转板卡上的电位计,改变呼吸灯闪烁速率,同时将ADC采集的数据通过串口发送到电脑上显示
标签
嵌入式系统
TC275
AURIX
littlestudent
更新2022-10-10
382

感谢硬禾学堂提供的这次学习英飞凌AURIX单片机TC275的机会,也是自己首次接触车规级高性能芯片。

首先是理解本次设计的任务:

FvHpFVDikpqIMVDn4kwGO0d3qjhA

根据任务描述,把任务2分成三个子任务:

  • Sub-1:实现呼吸灯
  • Sub-2:实现电位计采集的数据通过UART串口发送到电脑上位机
  • Sub-3:实现电位计采集的数据控制呼吸灯闪烁频率

下面分别介绍各模块的实现方法。

Sub-1:实现呼吸灯

所谓的呼吸灯就是一个LED小灯慢慢的亮起来,再慢慢的暗下去。这个所谓的“亮”与“暗”可以通过控制单片机引脚高低电平的不同组合来实现。这个高低电平组合起来的方波我们称之为PWM波,还有对应的一个叫做“占空比”的概念来调整高低电平的比例。这种方式对我这种不熟悉AURIX单片机PWM模块的小白来说,显然有些困难,不过同样的功能,还可以通过更加简单的延迟功能来实现呼吸灯!

void potentometer_breathLED(void){

    unsigned int i,j;
    for(i = 0; i < 500; i+= 10){
        for(j=0;j<200;j++){
            IfxPort_setPinLow(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, i));    /* Wait i microseconds            */
            IfxPort_setPinHigh(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, 500 - i));    /* Wait i microseconds            */
        }
    }

    for(i = 0; i < 500; i+= 10){
        for(j=0;j<100;j++){
            IfxPort_setPinHigh(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, i));    /* Wait i microseconds            */
            IfxPort_setPinLow(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, 500 - i));    /* Wait i microseconds            */
        }
    }

}

上面的简单代码就是利用延迟来实现LED灯呼吸的关键!第一个FOR循环来实现“呼”即小灯慢慢变亮;第二个FOR循环来实现“吸”即小灯慢慢变暗。

FjuILKvAWBbsSfkzGSSACFzfiamn

通过查找TC275 Lite的开发手册,看到板载的LED1小灯是低电平亮,高电平灭。所以在“呼”的过程中,小灯是灭->亮,刚开始要高电平100%,低电平0%,这个时间太短暂的话,人眼是捕捉不到这个亮度与下一个亮度的区别的,所以每次都让单一的亮度维持200次。

200 * 500us = 0.1s,维持100ms刚刚好,这个亮度阶梯变化的时候人眼能够识别出来

Sub-2:实现电位计采集的数据通过UART串口发送到电脑上位机

这个模块主要参考了英飞凌官方的例程:UART_VCOM_1_KIT_TC275_LK

TC275单片机的ASCLIN模块用于实现同步/异步串行通信,在本次设计中,我们实现的是TC275与电脑上位机串口软件的通信。首先是在Cpu0_Main.c文件中调用init_UART()来对外设ASCLIN进行初始化,相关的初始化代码如下:

void init_UART(void)
{
    /* Initialize an instance of IfxAsclin_Asc_Config with default values */
    IfxAsclin_Asc_Config ascConfig;
    IfxAsclin_Asc_initModuleConfig(&ascConfig, SERIAL_PIN_TX.module);

    /* Set the desired baud rate */
    ascConfig.baudrate.baudrate = SERIAL_BAUDRATE;

    /* ISR priorities and interrupt target */
    ascConfig.interrupt.txPriority = INTPRIO_ASCLIN0_TX;
    ascConfig.interrupt.typeOfService = IfxCpu_Irq_getTos(IfxCpu_getCoreIndex());

    /* FIFO configuration */
    ascConfig.txBuffer = &g_ascTxBuffer;
    ascConfig.txBufferSize = ASC_TX_BUFFER_SIZE;

    /* Port pins configuration */
    const IfxAsclin_Asc_Pins pins =
    {
        NULL_PTR,         IfxPort_InputMode_pullUp,     /* CTS pin not used     */
        &SERIAL_PIN_RX,   IfxPort_InputMode_pullUp,     /* RX pin not used      */
        NULL_PTR,         IfxPort_OutputMode_pushPull,  /* RTS pin not used     */
        &SERIAL_PIN_TX,   IfxPort_OutputMode_pushPull,  /* TX pin               */
        IfxPort_PadDriver_cmosAutomotiveSpeed1
    };
    ascConfig.pins = &pins;

    IfxAsclin_Asc_initModule(&g_asc, &ascConfig);                       /* Initialize module with above parameters  */
}

另外,Sub-3中ADC采集的数据透过调用如下函数my_send_UART_message(uint, uint *)来实现串口输出。

void my_send_UART_message(unsigned int count, uint8 * txData)
{
    IfxAsclin_Asc_write(&g_asc, txData, &count, TIME_INFINITE);         /* Transfer of data                         */
}

Sub-3:实现电位计采集的数据控制呼吸灯闪烁频率

这部分的工作主要是把ADC采集到的电位计数值用于控制Sub-1中呼吸灯的闪烁频率。参考了:ADC_Background_Scan_1_KIT_TC275_LK

下面是该模块的初始化代码:

/* The VADC module and group are initialized */
void vadcBackgroundScanInit(void)
{
    /* VADC module configuration */
    /* Create VADC configuration */
    IfxVadc_Adc_Config adcConfig;

    /* Initialize the VADC configuration with default values */
    IfxVadc_Adc_initModuleConfig(&adcConfig, &MODULE_VADC);

    /* Initialize the VADC module using the VADC configuration */
    IfxVadc_Adc_initModule(&g_vadcBackgroundScan.vadc, &adcConfig);

    /* VADC group configuration */
    /* Create group configuration */
    IfxVadc_Adc_GroupConfig adcGroupConfig;

    /* Initialize the group configuration with default values */
    IfxVadc_Adc_initGroupConfig(&adcGroupConfig, &g_vadcBackgroundScan.vadc);

    /* Define which ADC group is going to be used */
    adcGroupConfig.groupId = VADC_GROUP;
    adcGroupConfig.master = VADC_GROUP;

    /* Enable background scan source */
    adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;

    /* Enable background auto scan mode */
    adcGroupConfig.backgroundScanRequest.autoBackgroundScanEnabled = TRUE;

    /* Enable the gate in "always" mode (no edge detection) */
    adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;

    /* Initialize the group using the group configuration */
    IfxVadc_Adc_initGroup(&g_vadcBackgroundScan.adcGroup, &adcGroupConfig);
}

在core0的主函数中,开启BackgroundScan,然后在while循环中,不停的去读ADC采样值并根据这个采样值来改变呼吸灯闪烁频率。

    /* Start the background scan */
    vadcBackgroundScanRun();

    while(1)
    {
        /* Update the LEDs depending on the measured value */
        my_indicateConversionValue();
    }

在该函数中,对读取到的ADC值进行处理:

/* This function retrieves the conversion value and indicates it by LEDs */
void my_indicateConversionValue(void)
{
    Ifx_VADC_RES conversionResult;

    /* Retrieve the conversion value until valid flag of the result register is true */
    do
    {
        conversionResult = IfxVadc_Adc_getResult(&g_vadcBackgroundScan.adcChannel);
    }
    while (!conversionResult.B.VF);

    //if(conversionResult.B.RESULT < LIMIT_LOW)       /* LED1 lights up if the conversion value is smaller than 0x555 */
    if(conversionResult.B.RESULT < LIMIT_LOW){
        IfxPort_setPinLow(LED2);
    }else{
        IfxPort_setPinHigh(LED2);
    }
    unsigned int currentResult, modifiedCurrentResult;
    currentResult = conversionResult.B.RESULT;
    modifiedCurrentResult = 128 - (conversionResult.B.RESULT /32);

主要是如下这句,我们目前使能的是12bit的ADC,其采样值在0-4086,进行如下变换后,可把ADC采样值变换到128以内,用以后期控制闪烁间隔。

 modifiedCurrentResult = 128 - (conversionResult.B.RESULT /32);

在下面的代码中,modifiedCurrentResult 被用于控制相邻亮度的时间间隔,如下所示,采样值越小,时间间隔越大,观测到即闪烁最慢;采样值越大,时间间隔越小,闪烁越快。

    unsigned int i,j;

    for(i = 0; i < 500; i+= 10){
        for(j=0;j<modifiedCurrentResult;j++){
            IfxPort_setPinLow(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, i));    /* Wait i milliseconds            */
            IfxPort_setPinHigh(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, 500 - i));    /* Wait i milliseconds            */
        }
    }

   for(i = 0; i < 500; i+= 10){
        for(j=0;j<modifiedCurrentResult;j++){
            IfxPort_setPinHigh(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, i));    /* Wait i milliseconds            */
            IfxPort_setPinLow(LED1);
            waitTime(IfxStm_getTicksFromMicroseconds(BSP_DEFAULT_TIMER, 500 - i));    /* Wait i milliseconds            */
        }
    }

B站视频介绍

下面进行实物展示,

采样值较小时,以采样值435为例,呼吸灯闪烁速度较慢:

lkcOU1xLJ4BLr0MzLVnRTmf1nAvL

采样值居于中间值时,以2295为例,呼吸灯闪烁速度较中等:

lgkRIsf1ds882b9zmmYSd1zL5S8C

采样值较大时,以4095为例,呼吸灯闪烁速度最快:

lp268d-tazEQ2KxC-wrr9z-Vn4fM

总结:

英飞凌的这款TC275开发板是一款高性能、高安全性的微控制器开发平台,通过本次的Funpack2-2活动,了解了AURIX高性能单片机的基本架构,熟悉了相关的开发工具链,使自己对于AURIX单片机的了解得到提升。

附上自己收集的相关资料链接:

  1. 英飞凌官方论坛: https://community.infineon.com/t5/AURIX/bd-p/AURIX
  2. 英飞凌AURIX Development Studio安装和使用,助力Funpack2-2 https://www.bilibili.com/read/cv17627610
  3. 硬禾学堂 - 英飞凌Aurix系列处理器,助力智能车竞赛 https://www.bilibili.com/video/BV1aU4y1D7RZ?spm_id_from=333.337.search-card.all.click&vd_source=06b417808f9325071f39e5fd55985221
  4. 龙邱科技 - TC264极速入门 https://space.bilibili.com/95313236/channel/seriesdetail?sid=1578457
  5. 英飞凌AURIX™ Development Studio分享 https://www.bilibili.com/video/BV1SK4y177MK?spm_id_from=333.337.search-card.all.click&vd_source=06b417808f9325071f39e5fd55985221
  6. 英飞凌单片机休眠模式原理及程序讲解 https://www.bilibili.com/video/BV1P5411G7dx?spm_id_from=333.337.search-card.all.click&vd_source=06b417808f9325071f39e5fd55985221
  7. SAK-TC275TP-64F200W DC https://www.eetree.cn/doc/detail/2374
附件下载
ACE_Blinky_LED_1_KIT_TC275_LK.7z
Code for: Funpack2-2: 基于TC275的呼吸灯设计
团队介绍
自己一个人
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号