stm8s003的adc问题,比较奇怪,偶尔出现0

2019-07-19 20:50发布

玩stm8呢,做个电流表
采样的电压,很稳定, 38mv左右
但stm8采样来的电压就不稳定了,经常出现0和较大偏差
stm8的adc是10位

有了解的坛友么,啥原因呢
这玩意还不如stc的adc稳定呢

0C484BD28E6358A6C467C489DC25A56A.jpg
{X69U(DUDC~FQH@DR6Z~KG0.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zhxzhx
1楼-- · 2019-07-20 00:47
你转换速度是不是太快了
操作系统
2楼-- · 2019-07-20 02:49
 精彩回答 2  元偷偷看……
Electronic
3楼-- · 2019-07-20 05:14
 精彩回答 2  元偷偷看……
wishriver
4楼-- · 2019-07-20 08:36
操作系统 发表于 2017-5-6 08:22
先不要急着下结论.我也用过他的ADC功能.没有你想像中的那么差.先看一下是不是哪里没有设置好.

配置的转换速度是最慢了,而且,这只是个测试,程序里面什么都没有,采集显示,串口发送而已,
理论上,稳压用的7805波纹不大,实际上示波器测,也没有大波文
void ADC_Init()
{
//设置PC->4 为输入 悬空输入  中断禁止
  GPIO_Init(GPIOD , GPIO_PIN_3 , GPIO_MODE_IN_FL_NO_IT);
  
  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE ,   //单次转换模式
            ADC1_CHANNEL_4 ,               //配置为通道 2 采样 注意!!!
            ADC1_PRESSEL_FCPU_D18 ,        //采样速率为16M / 18
            ADC1_EXTTRIG_TIM ,             //外部触发
            DISABLE ,                      //不使能外部触发
            ADC1_ALIGN_RIGHT ,             //采样数据右对齐
            ADC1_SCHMITTTRIG_ALL ,        //施密特
            DISABLE                        //不使能施密特
            );
  
  ADC1_Cmd(ENABLE);     //启动ADC
}
u16 ADC_getData(void)
{
  u16 adcValue;
  ADC1_Cmd(ENABLE);     //启动ADC
  
  while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);  //等待转换结束
  ADC1_ClearFlag(ADC1_FLAG_EOC);  //清除转换结束标志
adcValue= ADC1_GetConversionValue();  //读取转换数据
}
wishriver
5楼-- · 2019-07-20 12:15
Electronic 发表于 2017-5-6 14:21
肯定是你的配置不对,我用来做电压表电流表都没有任何问题

配置的转换速度是最慢了,而且,这只是个测试,程序里面什么都没有,采集显示,串口发送而已,
理论上,稳压用的7805波纹不大,实际上示波器测,也没有大波文
void ADC_Init()
{
//设置PC->4 为输入 悬空输入  中断禁止
  GPIO_Init(GPIOD , GPIO_PIN_3 , GPIO_MODE_IN_FL_NO_IT);
  
  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE ,   //单次转换模式
            ADC1_CHANNEL_4 ,               //配置为通道 2 采样 注意!!!
            ADC1_PRESSEL_FCPU_D18 ,        //采样速率为16M / 18
            ADC1_EXTTRIG_TIM ,             //外部触发
            DISABLE ,                      //不使能外部触发
            ADC1_ALIGN_RIGHT ,             //采样数据右对齐
            ADC1_SCHMITTTRIG_ALL ,        //施密特
            DISABLE                        //不使能施密特
            );
  
  ADC1_Cmd(ENABLE);     //启动ADC
}
u16 ADC_getData(void)
{
  u16 adcValue;
  ADC1_Cmd(ENABLE);     //启动ADC
  
  while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);  //等待转换结束
  ADC1_ClearFlag(ADC1_FLAG_EOC);  //清除转换结束标志
adcValue= ADC1_GetConversionValue();  //读取转换数据
}

一周热门 更多>