adc1、adc2接的是温度传感器,我把温度传感器放入热水所测到的数据和常温下测到的数据基本一样。刚接触stm32,程序是拿网上的程序改的,不知道有没有错误,希望大神能指导一下。
void ADC12_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//开启时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2,ENABLE); //使能ADC传输
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIO传输
//GPIOC作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA
ADC_DeInit(ADC1); //复位ADC1
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟,72/6=12MHz
//-----------ADC1参数设置----------------------------------
ADC_InitStructure.ADC_Mode=ADC_Mode_RegSimult; //ADC同步规则模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //单通道模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=1; //顺序进行规则转换的ADC通道数目1
ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_71Cycles5); //ADC_Test1采样
//ADC_RegularChannelConfig(ADC1,ADC_Channel_6, 2,ADC_SampleTime_71Cycles5); //ADC_Test2采样
//ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 3,ADC_SampleTime_71Cycles5); //ADC_Test3采样
//ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 4,ADC_SampleTime_71Cycles5); //ADC_Test4采样
//-----------ADC2参数设置----------------------------------
ADC_InitStructure.ADC_Mode=ADC_Mode_RegSimult; //ADC同步规则模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //单通道模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=1; //顺序进行规则转换的ADC通道数目1
ADC_Init(ADC2,&ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC2,ADC_Channel_1 ,1,ADC_SampleTime_71Cycles5); //FreeBack1采样
//ADC_RegularChannelConfig(ADC2,ADC_Channel_7 , 2,ADC_SampleTime_71Cycles5); //FreeBack2采样
//ADC_RegularChannelConfig(ADC2,ADC_Channel_5, 3,ADC_SampleTime_71Cycles5); //FreeBack3采样
//ADC_RegularChannelConfig(ADC2,ADC_Channel_3, 4,ADC_SampleTime_71Cycles5); //FreeBack4采样
ADC_ExternalTrigConvCmd(ADC2, ENABLE); //使能ADC2外部触发转换
//------------DMA参数设置----------------------------------
DMA_DeInit(DMA1_Channel1); //将DMA的通道x寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR); //DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Adc_buffer; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从内存读取
DMA_InitStructure.DMA_BufferSize = 1; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //数据宽度为32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //数据宽度为32位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有中等优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_Cmd(DMA1_Channel1,ENABLE); //打开DMA传输
ADC_Cmd(ADC1,ENABLE); //使能ADC1
ADC_Cmd(ADC2,ENABLE); //使能ADC2
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
ADC_ResetCalibration(ADC2); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC2)); //等待复位校准结束
ADC_StartCalibration(ADC2); //开启AD校准
while(ADC_GetCalibrationStatus(ADC2)); //等待校准结束
ADC_DMACmd(ADC1, ENABLE); //ADC1 DMA传送数据打开
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换功能
}
此帖出自
小平头技术问答
一周热门 更多>