项目总结报告 硬件介绍
本次使用的开发板是Aurix™ Lite Kit Series-1搭载了一块英飞凌公司的TC275芯片,频率为 200MHz,4MB 闪存和 LQFP-176 封装,该芯片可以由英飞凌公司提供的免费的工具链进行编程烧录。该工具链完全支持C\C++,在开发过程中,具有iLLD来加速开发过程。板载一块DAP仿真芯片,可以通过USB3.0接口对芯片进行烧录,以及芯片的ASCLIN0单元的串口模块也可以通过DAP芯片将串口数据发送到USB3.0端口上。开发板上的接口具有相对较多的扩展端口,包括两个Infineon Shield2Go connectors,与arduino引脚相互兼容,一个mikroBUS接口,一个Micro-USB接口,CAN接口以及DAP接口。开发板上还有一个用户使用的按键,三个LED灯,复位按键以及一个10K\Omega的电位器。
任务分析
本次任务如下:
设计一个呼吸灯,通过旋转板卡上的电位计,改变呼吸灯闪烁速率,同时将ADC采集的数据通过串口/CAN,发送到另一台设备上显示。
首先是通过串口将数据发送到电脑,其次再使用ADC模块读取。
程序流程图如下所示
我的评价是这次的任务非常简单,用过英飞凌TC系列的单片机的朋友们应该一天的时间就能弄出来。没用过英飞凌单片机的同学也可以借着这次机会来学习一下单片机的使用方法。这次的任务就是白送一块板子,快来白嫖啊。
串口
拿到单片机要做的第一件事是点灯,第二件事就应该是将串口初始化完毕,并且完成和上位机的通讯。在串口调试完成后,就可以使用串口对单片机中相关数据进行打印,当单片机无法运行预期的成果时,就可以通过调取串口数据来观察程序出错的地方。
通过板子的数据手册我们可以看到,当通过USB与电脑想连接的时候,驱动器会自动安装,并且会产生一个端口,这个端口通过ASCLIN0模块进行串口收发,默认的引脚是P14.0和P14.1。
ASCLIN模块
ASC模块可以实现uart串口异步通讯协议。可以进行全双工异步通信。
由于单片机的ASCLIN模块默认为关闭状态,所以需要对器进行初始化,包括配置信息初始化以及模块的初始化,
串口程序展示
/* This function initializes the ASCLIN UART module */
void init_ASCLIN_UART(void)
{
/* Initialize an instance of IfxAsclin_Asc_Config with default values */
IfxAsclin_Asc_Config ascConfig;
IfxAsclin_Asc_initModuleConfig(&ascConfig, &MODULE_ASCLIN0);
/* Set the desired baud rate */
ascConfig.baudrate.baudrate = UART_BAUDRATE;
/* ISR priorities and interrupt target */
ascConfig.interrupt.txPriority = INTPRIO_ASCLIN0_TX;
ascConfig.interrupt.rxPriority = INTPRIO_ASCLIN0_RX;
ascConfig.interrupt.typeOfService = IfxCpu_Irq_getTos(IfxCpu_getCoreIndex());
/* FIFO configuration */
ascConfig.txBuffer = &g_ascTxBuffer;
ascConfig.txBufferSize = UART_TX_BUFFER_SIZE;
ascConfig.rxBuffer = &g_ascRxBuffer;
ascConfig.rxBufferSize = UART_RX_BUFFER_SIZE;
/* Pin configuration */
const IfxAsclin_Asc_Pins pins =
{
NULL_PTR, IfxPort_InputMode_pullUp, /* CTS pin not used */
&UART_PIN_RX, IfxPort_InputMode_pullUp, /* RX pin */
NULL_PTR, IfxPort_OutputMode_pushPull, /* RTS pin not used */
&UART_PIN_TX, IfxPort_OutputMode_pushPull, /* TX pin */
IfxPort_PadDriver_cmosAutomotiveSpeed1};
ascConfig.pins = &pins;
IfxAsclin_Asc_initModule(&g_ascHandle, &ascConfig); /* Initialize module with above parameters */
}
//分为模块初始化以及引脚初始化,以及一些中断的优先级。
//重定向函数,这样就可以使用printf函数了
int fputc(int ch, FILE *stream)
{
uart_putchar((char)ch);
return (ch);
}
ADC
英飞凌的adc模块包括了模数转换器,转换控制单元,请求控制单元,结果处理单元。ADC转换过程包括3各阶段,请求阶段,转换阶段和结果处理阶段。
输入通道
输入通道的主要参数有:采样时间、转换精度、参考电压以及结果寄存器指针。
总裁机制
如果请求源过多,则会启用总裁机制,总裁过后胜出的请求源会进行ADC转换。
数据存储
ADC的存储方式有8位,10位,12位可选,对其方式有左对齐以及右对齐。由于本次实验使用默认十二位的数据存储,所以没有左对齐右对齐的说法,默认数值范围位0~4096;归一化处理,
程序展示
/* 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);
}
/* The input channels to be used are setup and the VADC is set into run mode */
void vadcBackgroundScanRun(void)
{
/* Initialize the channel configuration of application handle g_vadcBackgroundScan with default values */
IfxVadc_Adc_initChannelConfig(&g_vadcBackgroundScan.adcChannelConfig, &g_vadcBackgroundScan.adcGroup);
g_vadcBackgroundScan.adcChannelConfig.channelId = (IfxVadc_ChannelId)CHANNEL_ID;
g_vadcBackgroundScan.adcChannelConfig.resultRegister = (IfxVadc_ChannelResult)CHANNEL_RESULT_REGISTER;
g_vadcBackgroundScan.adcChannelConfig.backgroundChannel = TRUE;
/* Initialize the channel of application handle g_VadcBackgroundScan using the channel configuration */
IfxVadc_Adc_initChannel(&g_vadcBackgroundScan.adcChannel, &g_vadcBackgroundScan.adcChannelConfig);
/* Enable background scan for the channel */
IfxVadc_Adc_setBackgroundScan(&g_vadcBackgroundScan.vadc,
&g_vadcBackgroundScan.adcGroup,
(1 << (IfxVadc_ChannelId)CHANNEL_ID),
(1 << (IfxVadc_ChannelId)CHANNEL_ID));
/* Start background scan conversion */
IfxVadc_Adc_startBackgroundScan(&g_vadcBackgroundScan.vadc);
}
PWM产生
呼吸灯的原理是PWM占空比的变化,使用GTM单元的TOM模块对LED进行PWM输出。
代码展示如下:
/* This function initializes the TOM */
void initGtmTomPwm(void)
{
IfxGtm_enable(&MODULE_GTM); /* Enable GTM */
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK); /* Enable the FXU clock */
/* Initialize the configuration structure with default parameters */
IfxGtm_Tom_Pwm_initConfig(&g_tomConfig, &MODULE_GTM);
g_tomConfig.tom = LED.tom; /* Select the TOM depending on the LED */
g_tomConfig.tomChannel = LED.channel; /* Select the channel depending on the LED */
g_tomConfig.period = PWM_PERIOD; /* Set the timer period */
g_tomConfig.pin.outputPin = &LED; /* Set the LED port pin as output */
g_tomConfig.synchronousUpdateEnabled = TRUE; /* Enable synchronous update */
IfxGtm_Tom_Pwm_init(&g_tomDriver, &g_tomConfig); /* Initialize the GTM TOM */
IfxGtm_Tom_Pwm_start(&g_tomDriver, TRUE); /* Start the PWM */
}
/* This function creates the fade effect for the LED */
uint32 fadeLED(float omega)
{
static float t = 0;
g_fadeValue = (PWM_PERIOD * sinf(omega * 10 * (t += 0.05)) + PWM_PERIOD) / 2;
// if ((g_fadeValue + FADE_STEP) >= PWM_PERIOD)
// {
// g_fadeDir = -1; /* Set the direction of the fade */
// }
// else if ((g_fadeValue - FADE_STEP) <= 0)
// {
// g_fadeDir = 1; /* Set the direction of the fade */
// }
// g_fadeValue += g_fadeDir * FADE_STEP; /* Calculation of the new duty cycle */
setDutyCycle(g_fadeValue); /* Set the duty cycle of the PWM */
return g_fadeValue;
}
/* This function sets the duty cycle of the PWM */
void setDutyCycle(uint32 dutyCycle)
{
g_tomConfig.dutyCycle = dutyCycle; /* Change the value of the duty cycle */
IfxGtm_Tom_Pwm_init(&g_tomDriver, &g_tomConfig); /* Re-initialize the PWM */
}
功能展示
通过电位器控制呼吸灯闪烁频率,并且再上位机显示。
心得体会
本次项目属于是对单片机的一个综合运用,其中调用了单片机中的三个单元,分别是ASCLIN单元,GTM单元和ADC单元。在一项有关于该芯片的竞赛中,也就是智能车竞赛中,这三个单元是一定会被用到的。对零基础的,但是想参加智能车竞赛的同学来说完成了本次任务,也就意味着在智能车竞赛的方向迈出了第一步。
总结一下这次项目,这次项目主要是初始化了串口模块,ADC模块,TOM模块,并且根据任务合理编程,完成了本次项目。
最后吐槽一下,之前一直想吐槽但是一直忘记的一件事:这个网站上的tiny编辑器,不论是使用word导入还是使用markdown导入,都会导致排版错误。而且如果在网页上编辑,下意识ctrl+s后会刷新网页,而且不会保存,这件事就很让人头疼,根本不想在线编辑。