小弟目前在做项目的时候遇到一个很费解的ADC故障... 在ADC采集的时候,我用的是单次采集的用法. 在2个ADC通道采集过程中,如果仅仅只采集一个通道,不采集另外一个通道,发现数据都能正常读取. 但是把2个通道同时放入主函数轮流采集的时候.发现读数就发现巨大变化,正常情况下,我采集的到AD电压数据换算后是0.8V,但是现在读数换算后居然是21V!!!!!!!!! 但是只要不开启任一一路ADC通道,则另外那一路ADC通道的读数又恢复正常.. 有大大能帮我答疑解惑吗?不胜感激... |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:STM8 多通道ADC采集故障,望指点
RE:STM8 多通道ADC采集故障,望指点
RE:STM8 多通道ADC采集故障,望指点
还是上代码看的明白,这个只是猜呢
回复:STM8 多通道ADC采集故障,望指点
u8 ADC1_change(u8 change) //AD信号采集函数
{
u8 ADData;
u16 AD_result,AD_sum,AD_data0,AD_data1;
u8 i;
for(i=0;iCSR = change&0x0F; // 选择AD转换通道
ADC1->CR1 |= 0x01; // 启动AD转换
while(!(ADC1->CSR & 0x80)); // 等待AD转换完成
ADC1->CSR = 0x7F;
}
for(i=0;iCSR = change&0x0F; // 选择AD转换通道
ADC1->CR1 |= 0x01; // 启动AD转换
while(!(ADC1->CSR & 0x80)); // 等待AD转换完成
AD_data1 = ADC1->DRH;
AD_data0 = ADC1->DRL;
ADC1->CSR &= ~0x80;
AD_result = (AD_data1*256)+AD_data0;
AD_sum+=(AD_result*50/1024);
}
AD_sum/=10;
ADData=AD_sum;
return(ADData);
}
void ADC1_init(void)
{
ADC1->CR1 = 0x40; // 设置AD转换时钟1/8,单次 转换模式
ADC1->CR2 = 0x08; // 设置数据为右对齐
ADC1->CR3 = 0x00; // 不使用数据缓冲
//ADC1->TDRL = 0xff; //关闭施密特触发器
ADC1->CR1 |= 0x01; // 打开AD模块电源
}
while(1)
{
accel=ADC1_change(0x04);
Bat=ADC1_change(0x01);
mode=ADC1_change(0x00);
}
RE:STM8 多通道ADC采集故障,望指点
RE:STM8 多通道ADC采集故障,望指点
RE:STM8 多通道ADC采集故障,望指点
我采用的是STM32F103C8芯片。
你可以做这样一个试验:第一步:两个通道是不加任何内容的,即一般说的是零值采样;第二步:一个通道是满量程,另一个通道是零值;第三步,量这两步的零值电压有什么变化。
我是第一次接触,我觉得是由于两个通道之间切换过快引起的。楼主可以再切换完成后延时在采集。在配置的时候我将采样周期由ADC_SampleTime_41Cycles5改为ADC_SampleTime_239Cycles5。采样点就比较稳定了
RE:STM8 多通道ADC采集故障,望指点
{
uint16_t GetADC_Value = 0;
FlagStatus flag_status;
//ADC1_DeInit();
/*
* ADC1_CONVERSIONMODE_CONTINUOUS = 转换模式:连续转换 ADC1_CONVERSIONMODE_SINGLE= 单次转换
ADC1_CHANNEL_2 = ADC通道2
ADC1_PRESSEL_FCPU_D2 = 时钟分频器 fADC1= fMASTER/2
ADC1_EXTTRIG_TIM, DISABLE = 启用或者关闭外部触发转换事件:内部定时器1的TRG事件--关闭
ADC1_ALIGN_LEFT = 数据对齐方向:左对齐
ADC1_SCHMITTTRIG_CHANNEL0, DISABLE = 启用或者关闭指定通道的施密特触发器:通道2--关闭
(ADC1_SCHMITTTRIG_ALL, DISABLE = 所有通道--关闭)
*/
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel, ADC1_PRESSEL_FCPU_D2, \
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);
ADC1_Cmd(ENABLE);
ADC1_StartConversion();
delay_us(10);
flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
if (flag_status != RESET) // SET or RESET
{
GetADC_Value = ADC1_GetConversionValue(); //返回ADC结果
}
return GetADC_Value;
}
//读AD值
void Read_Temperature_TEST()
{
Conversion_Value = Get_ADCCH_Value(ADC1_CHANNEL_3); //TEMP_AD_TEST_Value PD2
TEMP_AD_TEST_Value = Conversion_Value;
Conversion_Value = Get_ADCCH_Value(ADC1_CHANNEL_4); //TEMP_AD_Value PD3
TEMP_AD_Value = Conversion_Value;
}
在主循环里面,跑Read_Temperature_TEST()。读出来的值是 TEMP_AD_TEST_Value = 464, TEMP_AD_Value = 1000 证明第三通道读出来是正常的,后面通道的受到第三通道的在通道切换时的相互影响,所以后面的第4通道读出来的值就不正常。但是,如果单独只读一个通道,另一个通道不读,这两个通道分别读出来的AD值都是正常的。。太不可思议了,还有这种情况出现 ,希望引起大家的注意。
希望有解决办法的高人出来指点一下。
不懂stm8有两个ADC。。
不懂两只ADC同时开?有这种必要?
stm32 的双ADC有要求,采样时间不能重叠。估计你就是重叠了。
时钟频率当然是越慢越好。采样时间当然也是越长越好。