ADC1采集4通道的12位电压值,通过DMA传输,电压偏差太大,不知道什么原因,求大神解答
以下是部分程序
[mw_shl_code=c,true]//初始化GPIO PA0,PA1,PA6,PA7作为采集通道
void MYADC_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_6|GPIO_Pin_7;//PA0 PA1 PA6 PA7
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //浮空
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void MYADC_Init_Config(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStructrue;
ADC_InitTypeDef ADC_InitStructrue;
// 开启ADC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
ADC_CommonInitStructrue.ADC_Mode=ADC_Mode_Independent;//独立模式
ADC_CommonInitStructrue.ADC_Prescaler=ADC_Prescaler_Div4;//4分频
ADC_CommonInitStructrue.ADC_DMAAccessMode=ADC_DMAAccessMode_1;//DMA模式1
ADC_CommonInitStructrue.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_10Cycles;
ADC_CommonInit(&ADC_CommonInitStructrue);
ADC_InitStructrue.ADC_Resolution=ADC_Resolution_12b;
ADC_InitStructrue.ADC_ScanConvMode=ENABLE;//扫描模式
ADC_InitStructrue.ADC_ContinuousConvMode=ENABLE;//连续模式
ADC_InitStructrue.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//不需要外部触发
ADC_InitStructrue.ADC_DataAlign=ADC_DataAlign_Right;//数据方向最右
ADC_InitStructrue.ADC_NbrOfConversion=4;//通道数量
ADC_Init(ADC1,&ADC_InitStructrue);
//转换的通道、顺序
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles);//第一次转换通道0
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_56Cycles);//第二次转换通道1
ADC_RegularChannelConfig(ADC1,ADC_Channel_6,3,ADC_SampleTime_56Cycles);//第三次转换通道3
ADC_RegularChannelConfig(ADC1,ADC_Channel_7,4,ADC_SampleTime_56Cycles);//第四次转换通道4
ADC_Cmd(ADC1,ENABLE);//使能ADC
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);// 使能DMA请求
ADC_DMACmd(ADC1,ENABLE);
ADC_SoftwareStartConv(ADC1);//开始adc转换,软件触发
}
[/mw_shl_code]
以下是main()函数部分内容
[mw_shl_code=c,true] for(i=0;i<2;i++)//通道0 1
{
ADC_Conversion_Value=(float)ADC_DMA_VALUE*(3.3/4096);
printf("ADC1的通道%d的电压值: %f
",i,ADC_Conversion_Value);
}
for(i=2;i<4;i++)//通道6 7
{
ADC_Conversion_Value=(float)ADC_DMA_VALUE*(3.3/4096);
printf("ADC1的通道%d的电压值: %f
",(i+4),ADC_Conversion_Value);
}
printf("
");[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[mw_shl_code=c,true]//par:外设地址,mar:SRAM地址,data_amount:传输的数据长度
void MYDMA_Init(u32 par,u32 mar,u16 data_amount)
{
DMA_InitTypeDef DMA_InitStructrue;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
DMA_DeInit(DMA2_Stream0);
while(DMA_GetCmdStatus(DMA2_Stream0)!=DISABLE);//等待DMA可以配置
DMA_InitStructrue.DMA_Channel=DMA_Channel_0;
DMA_InitStructrue.DMA_PeripheralBaseAddr= par;//外设地址
DMA_InitStructrue.DMA_Memory0BaseAddr=mar;//外设地址
DMA_InitStructrue.DMA_DIR=DMA_DIR_PeripheralToMemory;
DMA_InitStructrue.DMA_BufferSize=data_amount;//数据传输量
DMA_InitStructrue.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructrue.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructrue.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位
DMA_InitStructrue.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位
DMA_InitStructrue.DMA_Mode = DMA_Mode_Circular;// 模式选择
DMA_InitStructrue.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructrue.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructrue.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructrue.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructrue.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA2_Stream0,&DMA_InitStructrue);
DMA_Cmd(DMA2_Stream0, ENABLE); //开启DMA传输
}[/mw_shl_code]
一周热门 更多>