1. 工具说明
MCU:TC397
EB: 26.2.0 (AS440)
2. 目标
使用AN17/P40.10做为ADC 检测电压。
关于ADC的知识,网上有很多也很详细,我这里就不做多余的说明。
对于这款MCU,官方给提供了EB工具可以配置ADC模块,减少了对ADC驱动的编写。触发方式有软件和硬件两种,这里先介绍软件触发。如有问题,可以一起讨论。
3.EB配置
3.1 时钟使用默认的160M
Mcu->McuClockSettingConfig_0
3.2 ADC模块
可以参考如下配置


下面就是ADC硬件单元了,这里的硬件单元可以添加很多组,我这里只用一组做试验使用,具体使用哪组,可以看AN17对应哪路ADC group 。
下图datasheet里显示AN17是group 2,所以在AdcHwUnitId 里选择HWUNIT_ADC2。


3.2.1 Adc->AdcHwUnit_0
使用默认配置就可以了

AdcClockSource(ADC时钟源) :系统时钟

AdcPrescale(选择分频系数): 160/(7+1)
160:上面MCU给ADC的时钟频率

AdcHwUnitInputClass:

AdcChannel:
每组ADC里有很多通道,通过AdcAnChannelNum 来区分。这里只配置一个AN17来做试验。

AdcAnChannelNum 的选择按照下图的datasheet来,group 2 channel 1

3.2.2 Adc->AdcHwUnit_0->AdcHWGroup
AdcGroupAccessMode : ADC_ACCESS_MODE_SINGLE(单个访问模式)
AdcGroupConversionMode :ADC_CONV_MODE_ONESHOT(触发后进行一次通道组转换)
AdcGroupTriggSrc :ADC_TRIGG_SRC_SW(软件触发)
AdcStreamingBufferMode : ADC_STREAM_BUFFER_LINEAR(一旦达到采样数,ADC驱动就停止转换)

配置中断回调函数,完成一次转换调用一次。

定义一组里有哪些通道,我这里只使用了一个通道。

参数结果配置寄存器,存储ADC转换的结果。参数的值按照升序排列。
3.3 IRQ中断配置
Irq->IrqAdcConfig_0

3.4 ResourceM

4. 代码示例
首先需要把 Adc_Irq.c拷贝到自己的工程中。
初始化代码:
#include "Irq.h"
#include "Adc.h"
#define SRE_ENABLE (1<<10)
Adc_ValueGroupType Data_Buffer[10];
//回调函数
void IoHwAb_AdcNotification64(void)
{
}
void Adc_SWGroup(void)//ADC SW convert
{
Std_ReturnType lRetVal;
lRetVal = Adc_SetupResultBuffer(AdcConf_AdcGroup_AdcHWGroup, Data_Buffer);
if(lRetVal != E_NOT_OK)
{
Adc_EnableGroupNotification(AdcConf_AdcGroup_AdcHWGroup);
Adc_StartGroupConversion(AdcConf_AdcGroup_AdcHWGroup);
}
}
void BSW_ADC_Init(void)
{
const Adc_ConfigType * ConfigPtr = NULL_PTR;
ConfigPtr = &Adc_Config;
/* ADC Initialization */
Adc_Init(ConfigPtr);
/* ADC Startup Calibration */
Adc_TriggerStartupCal();
/* Wait till the Start Calibration is over*/
while(Adc_GetStartupCalStatus() != ADC_STARTUP_CALIB_OVER);
/* Initialize the SRPN and TOS for used interrupts */
IrqAdc_Init();
SRC_VADCG2SR0.U |= SRE_ENABLE;
SRC_VADC_G2_SR0.B.SRE = 1;
// Adc_StartGroupConversion(AdcConf_AdcGroup_AdcHWGroup);
Adc_SWGroup();
}
周期采样:
void Task_500ms_ASW(void)
{
uint8 i=0;
Adc_SWGroup();
}
注释: IoHwAb_AdcNotification64函数可以在里面添加自己想要的功能,在ADC完成转换后显示。软件触发需要周期调用函数Adc_StartGroupConversion才能获取新的数据,如果只在初始化的时候调用一次,只完成一次ADC转换。

6196

被折叠的 条评论
为什么被折叠?



