ADC1和ADC2采样模式相同,但其中ADC1为主ADC,ADC2为从ADC。
该模式在ADC_CR1寄存器中配置:(具体资料请参详STM32参考手册)
在双ADC模式中,ADC1和ADC2的规则通道转换数据均会保存到主数据寄存器,也就是ADC1数据寄存器(ADC1_DR)中。为了能在主寄存器中读取从ADC的转换数据,必须使能DMA位。 无论是否使用DMA传输规则通道数据 。
在ADC_CR2寄存器中配置:
如果ADC1使用软件触发,ADC2则使用外部通道触发;ADC1使用外部事件触发时,ADC2设置成软件触发,这样可以防止意外触发从转换。
/****
* 程序功能:实现双ADC同步采集,每路ADC各有1个通道(单通道)
*
******/
#include "adc.h"
#include "delay.h"
#include "usart.h"
#define M 128
#define N 8
uint16_t value[N][M];
u32 ADC_ConvertedValue;
//初始化ADC1
void Adc1_Multi_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工作模式:ADC1同步规则组模式
ADC_InitStructure.ADC_ScanConvMode =DISABLE; //模数转换工作在非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
// 开启ADC的DMA支持
ADC_DMACmd(ADC1, ENABLE); //使能ADC的DMA位
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //使能ADC1
/* Enable ADC1 reset calibaration register 使能ADC1复位校准寄存器 */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register ADC1复位校准寄存器检查结束*/
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration 启动ADC1校准 */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration ADC1校准检查结束 */
while(ADC_GetCalibrationStatus(ADC1));
}
//初始化ADC2
void Adc2_Multi_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC2 , ENABLE ); //使能ADC2通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PB0,1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);
ADC_DeInit(ADC2); //复位ADC2,将外设 ADC2 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工作模式:ADC1同步规则组模式
ADC_InitStructure.ADC_ScanConvMode =DISABLE; //模数转换工作在非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC2, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5 );
ADC_ExternalTrigConvCmd(ADC2, ENABLE); //使能ADC2的外部触发模式
/* Enable ADC2 */
ADC_Cmd(ADC2, ENABLE); //使能ADC2
/* Enable ADC1 reset calibaration register 使能ADC2复位校准寄存器 */
ADC_ResetCalibration(ADC2);
/* Check the end of ADC1 reset calibration register ADC2复位校准寄存器检查结束*/
while(ADC_GetResetCalibrationStatus(ADC2));
/* Start ADC1 calibaration 启动ADC2校准 */
ADC_StartCalibration(ADC2);
/* Check the end of ADC1 calibration ADC2校准检查结束 */
while(ADC_GetCalibrationStatus(ADC2));
}
/*初始化ADC */
void MY_ADC_Init(void)
{
Adc1_Multi_Init();
Adc2_Multi_Init();
}
void task_adc(void)
{
int i;
printf("\r\n 采样开始\r\n");
for(i=0;iDR;
value[0][i] = (ADC_ConvertedValue&0xffff); //获取ADC的值
value[1][i] = ((ADC_ConvertedValue>> 16)&0xffff); //获取ADC的值
printf("\r\n 编号%d \t 编号%d \t AD值: %d\r\n", 0,i, value[0][i]);
printf("\r\n 编号%d \t 编号%d \t AD值: %d\r\n", 1,i, value[1][i]);
}
printf("\r\n 采样结束\r\n");
}
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void Adc1_Multi_Init(void);
void Adc2_Multi_Init(void);
void MY_ADC_Init(void);
void task_adc(void);
#endif
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "adc.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
MY_ADC_Init(); //ADC初始化
while(1)
{
task_adc();
LED0=!LED0;
delay_ms(250);
}
}
源码下载链接:https://download.csdn.net/download/shouwangyunkai666/11214477
如有问题,欢迎随时交流!