SWM32SRET6单片机的ADC功能介绍与串口应用

SWM32SRET6单片机的ADC功能介绍与串口应用,第1张

 

1.ADC功能介绍

SWM32SRET6单片机内置2个12位SAR型ADC,最多支持8通道,1MSPS 转换速率。支持软件触发、定时器触发。该单片机的ADC模块结构框图如下,

SWM32SRET6单片机的ADC功能介绍与串口应用,264e1d28-0e8a-11ed-ba43-dac502259ad0.png,第2张

该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);}

  审核编辑:汤梓红

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2711561.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存