1.ADC功能介绍
SWM32SRET6单片机内置2个12位SAR型ADC,最多支持8通道,1MSPS 转换速率。支持软件触发、定时器触发。该单片机的ADC模块结构框图如下,
该ADC相比于其它单片机内部ADC来说,有两个特点,一个是硬件平均器,一个是8级深度的FIFO。硬件平均器可以减少CPU软件求平均的工作量,8级深度的FIFO也可以减少中断的频率(如果使能中断),两者都提高程序的效率。唯一遗憾的是没有看到DMA部分内容,应该是不支持DMA读取。
2.串口应用直接来看程序:
void ADCInit(void)
{
ADC_InitStructure ADC_initStruct;
PORT_Init(PORTC, PIN6, PORTC_PIN6_ADC1_IN1, 0); //PC6 => ADC1.CH1
ADC_initStruct.clk_src = ADC_CLKSRC_VCO_DIV64; //注意:ADC1只能使用VCO时钟,不能使用ADC_CLKSRC_HRC
ADC_initStruct.clk_div = 25;
ADC_initStruct.pga_ref = PGA_REF_INTERNAL;
ADC_initStruct.channels = ADC_CH1;
ADC_initStruct.samplAvg = ADC_AVG_SAMPLE16; //16次硬件平均
ADC_initStruct.trig_src = ADC_TRIGSRC_SW; //软件触发
ADC_initStruct.ConTInue = 1; //连续模式
ADC_initStruct.EOC_IEn = 0;
ADC_initStruct.OVF_IEn = 0;
ADC_initStruct.HFULL_IEn = ADC_CH1; //使能FIFO半满中断
ADC_initStruct.FULL_IEn = 0;
ADC_Init(ADC1, &ADC_initStruct); //配置ADC
ADC_Open(ADC1); //使能ADC
ADC_Start(ADC1);
}
首先需要初始化IO口为ADC输入模式。ADC的IO只能是固定的几个,不像UART等数字接口一样可以灵活配置。
其次是ADC功能的配置。首先选择时钟源和通道,这里使能了ADC1的CH1,如果需要多个通道扫描,则几个通道号相与即可:
ADC_initStruct.channels = ADC_CH1| ADC_CH2| ADC_CH3;
开启了16次硬件平均,即启动一次转换,硬件自动采样16次并输出平均值。
这里使能了连续转换模式。开启了FIFO半满中断。ADC有多个中断源:
EOC_IEn--转换结束中断
OVF_IEn--FIFO溢出中断
HFULL_IEn—FIFO半满中断
FULL_IEn—FIFO满中断
转换结束中断是每次ADC转换完成后中断一次。由于有FIFO的存在,这里使能了FIFO半满中断,这样ADC采样后自动将数据存在FIFO中,当FIFO半满时中断一次读出全部数据。这样可以减少程序中断的频率。
在中断函数中,需要清除中断标志,读取FIFO中的数据,如果是单次转换模式,还需要重新触发ADC转换。程序如下:
uint16_t adc_buf[100];
uint16_t adc_cnt = 0;
void ADC1_Handler(void)
{
ADC1->IF = (1 << ADC_IF_CH1HFULL_Pos);//
while((ADC1->CH[1].STAT & ADC_STAT_EMPTY_Msk) == 0)//读出FIFO中全部数据
{
adc_buf[adc_cnt] = ADC_Read(ADC1, ADC_CH1);
adc_cnt++;
if(adc_cnt == 100)
adc_cnt = 0;
}
//ADC_Start(ADC1);
}
审核编辑:汤梓红
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)