初级会员
- 积分
- 120
- 金钱
- 120
- 注册时间
- 2012-7-28
- 在线时间
- 6 小时
|
1金钱
最近用GD32F103 遇到这个问题,单个通道采集都正常,开了2个以上数据就错位了,本来应该是通道0的数据给adcx_speed ,通道5的数据给adcx_temp ,通道7的数据给adcx_M1V ,结果通道0的数据给了adcx_temp ,通道5的数据给了adcx_M1V ,通道7的数据给了adcx_speed ,求各位大神指正
ADC.C
#include "adc.h"
#include "delay.h"
//初始化ADC
//这里我们仅以规则通道为例
void Adc_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
//PA0,PA5,PA7 AD端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_7;// //PA0 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式设置
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转化模式设置
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//需要扫描的通道数
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,2,ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_7,3,ADC_SampleTime_1Cycles5);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
delay_ms(1);
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
//获得ADC1值
//ch:通道值
u16 Get_Adc1(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_1Cycles5 ); //ADC1,ADC通道,采样时间为1.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 Get_Adc1_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc1(ch);
delay_us(10);
}
return temp_val/times;
}
MAIN.C
#include "stm32f10x.h"
#include "timer.h"
#include "GPIO.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#define speed_off 0
//u16 speed_lev=0;
u16 adcx_speed = 0;//速度
u16 adcx_temp = 0;//温度
u16 adcx_M1V = 0;
u16 adcx_M2V = 0;
u16 adcx_M1M2V = 0;
/************************************************
************************************************/
int main(void)
{
// NVIC_Configuration();
delay_init(); //延时函数初始化
GPIOx_Init();
Adc_Init(); //ADC初始化
while(1)
{
adcx_speed = Get_Adc1(ADC_Channel_0);
delay_ms(10);
adcx_temp = Get_Adc1(ADC_Channel_5);
delay_ms(10);
adcx_M1V = Get_Adc1(ADC_Channel_7);
delay_ms(10);
}
}
|
最佳答案
查看完整内容[请看2#楼]
已解决,加了一句指令,不知道为什么
u16 Get_Adc1(u8 ch)
{
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_1Cycles5 );
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
}
|