感谢硬禾学堂提供的这次学习英飞凌AURIX单片机TC275的机会,也是自己首次接触车规级高性能芯片。
首先是理解本次设计的任务:
根据任务描述,把任务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循环来实现“吸”即小灯慢慢变暗。
通过查找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 */
}
}
下面进行实物展示,
采样值较小时,以采样值435为例,呼吸灯闪烁速度较慢:
采样值居于中间值时,以2295为例,呼吸灯闪烁速度较中等:
采样值较大时,以4095为例,呼吸灯闪烁速度最快:
总结:
英飞凌的这款TC275开发板是一款高性能、高安全性的微控制器开发平台,通过本次的Funpack2-2活动,了解了AURIX高性能单片机的基本架构,熟悉了相关的开发工具链,使自己对于AURIX单片机的了解得到提升。
附上自己收集的相关资料链接:
- 英飞凌官方论坛: https://community.infineon.com/t5/AURIX/bd-p/AURIX
- 英飞凌AURIX Development Studio安装和使用,助力Funpack2-2 https://www.bilibili.com/read/cv17627610
- 硬禾学堂 - 英飞凌Aurix系列处理器,助力智能车竞赛 https://www.bilibili.com/video/BV1aU4y1D7RZ?spm_id_from=333.337.search-card.all.click&vd_source=06b417808f9325071f39e5fd55985221
- 龙邱科技 - TC264极速入门 https://space.bilibili.com/95313236/channel/seriesdetail?sid=1578457
- 英飞凌AURIX™ Development Studio分享 https://www.bilibili.com/video/BV1SK4y177MK?spm_id_from=333.337.search-card.all.click&vd_source=06b417808f9325071f39e5fd55985221
- 英飞凌单片机休眠模式原理及程序讲解 https://www.bilibili.com/video/BV1P5411G7dx?spm_id_from=333.337.search-card.all.click&vd_source=06b417808f9325071f39e5fd55985221
- SAK-TC275TP-64F200W DC https://www.eetree.cn/doc/detail/2374