首页 > 应用 > 单片机应用
[导读] 12位ADC是一种逐次逼近型模拟数字数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。

 12位ADC是一种逐次逼近型模拟数字数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。

ADC通常要与DMA一起使用 这里只是简单的用库配置ADC 不断扫描来实现ADC的应用。

配置DMA:

void DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体 DMA_DeInit(DMA_Channel1);//复位DMA通道1 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址 DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小1 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址不变 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式   DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输   DMA_Init(DMA_Channel1, &DMA_InitStructure);//初始化DMA通道1   DMA_Cmd(DMA_Channel1, ENABLE); //使能DMA通道1 }

配置ADC的运行:

void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为通道1 ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5); //ADC1选择信道14,音序器等级1,采样时间239.5个周期 ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA ADC_Cmd(ADC1, ENABLE);//使能ADC1 ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成 ADC_StartCalibration(ADC1);//开始ADC1校准 while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换 }

(1) 第一个参数是ADC_Mode,这里设置为独立模式:

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。

(2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置为ENABLE。

(3) 第三个参数是ADC_ContinuousConvMode,这里设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。所以如果需要一次性采集1024个数据或者更多,则采用连续转换。

(4) 第四个参数是ADC_ExternalTrigConv,即选择外部触发模式。这里只讲三种:

1、第一种是最简单的软件触发,参数为ADC_ExternalTrigConv_None。设置好后还要记得调用库函数:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

这样触发才会启动。

2、第二种是定时器通道输出触发。共有这几种:ADC_ExternalTrigConv_T1_CC1、ADC_ExternalTrigConv_T1_CC2、ADC_ExternalTrigConv_T2_CC2、

ADC_ExternalTrigConv_T3_T以及ADC_ExternalTrigConv_T4_CC4。定时器输出触发比较麻烦,还需要设置相应的定时器。以

ADC_ExternalTrigConv_T2_CC2触发为例设置相应的定时器:

void TIM2_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Prescaler = 4; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0XFF; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0X7F; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); }

这样设置之后就可以用定时器2的输出触发了,至于触发的周期,设置TIM2的时间即可。这里不再赘述。

3、第三种是外部引脚触发,对于规则通道,选择EXTI线11和TIM8_TRGO作为外部触发事件;而注入通道组则选择EXTI线15和TIM8_CC4作为外部触发事件。

(5) 第五个参数是ADC_DataAlign,这里设置为ADC_DataAlign_Right右对齐方式。建议采用右对齐方式,因为这样处理数据会比较方便。当然如果要从高位开始传输数据,那么采用左对齐优势就明显了。

(6) 第六个参数是ADC_NbrOfChannel,顾名思义:通道的数量。要是到多个通道采集数据的话就得设置一下这个参数。此外在规则通道组的配置函数中也许将各个通道的顺序定义一下,如:

ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);

多通道数据传输时有一点还要注意:若一个数组为ADC_ValueTab[4],且设置了两个通道:通道1和通道2,则转换结束后,ADC_ValueTab[0]和ADC_ValueTab[2]存储的是通道1的数据,而ADC_ValueTab[1]和ADC_ValueTab[3]存储的是通道2的数据。如果数组容量大则依次类推。

补充一点:在使用DMA传输数据的时候,需要设置外设地址和存储器地址,外设地址当然就是ADC的地址了,而存储器的地址如果使用8位数据的话,存储器必须定义为8位缓冲区;如果使用16位数据格式的话,存储器则为16位缓冲器,不可定义为32位或更多,否则,数据将出错。

换一批

延伸阅读

[新鲜事] 全新Netduino 3登陆Mouser,新增Wi-Fi连接功能

全新Netduino 3登陆Mouser,新增Wi-Fi连接功能

贸泽电子(Mouser Electronics) 开始分销Netduino 3电子平台,能够使商业硬件解决方案和个人电子项目快速上市,同时提供了最大的设计灵活性并降低了风险。最新版本的开源Netduino平台不但具有让先前版本广受欢迎的最佳......

关键字:Netduino STM32F4

[单片机新闻] 意法半导体STM32H7系列微控制器利用全新Arm 平台安全架构强化互联智能设备保护功能

 意法半导体STM32H7系列微控制器利用全新Arm 平台安全架构强化互联智能设备保护功能

Arm平台安全架构(PSA)采用高性价比、领先技术全面提升物联网市场的安全技术支持 基于STM32H7系列开发的Arm® Cortex®-M7微控制器整合PSA概念和先进的安全功能服务......

关键字: 意法半导体 STM32 微控制器

[测试测量] 温度测量系统中高精度ADC设计

温度测量系统中高精度ADC设计

系统的精度由温度传感器的精度,以及将传感器数据进行数字化的高性能ADC决定。在工业以及医疗的应用中很多温度测量通常需要±0.1°C或者更好的测量精度,合理的成本以及更低的功耗。......

关键字:温度测量系统 ADC

[单片机新闻] 意法半导体提供集成数字滤波器的新STM32L4微控制器,扩展开发生态系统

意法半导体提供集成数字滤波器的新STM32L4微控制器,扩展开发生态系统

意法半导体开始量产STM32L45x超低功耗微控制器(MCU),STM32L451、STM32L452和STM32L462产品线集成Sigma-Delta调制器(DFSDM)用数字滤波器,可以在一款价格低廉的微控制器上实现高级音频功能。......

关键字:意法半导体 数字滤波器 STM32L4

[消费类电子新闻] 意法半导体(ST)与DSP Concepts合作,为STM32用户提供免费的高级音频设计工具

意法半导体(ST)与DSP Concepts合作,为STM32用户提供免费的高级音频设计工具

近日,横跨多重电子应用领域、全球领先的半导体供应商意法半导体新推出简易好用的图形界面的STM32™微控制器设计工具,让穿戴设备、物联网硬件等小电子产品现在能够为消费者提供高端音频功能,例如高级听觉用户界面。......

关键字:意法半导体 STM32
条评论

我 要 评 论

网友评论

技术子站

更多

推荐博客