打印
[STM8]

STM8S003K3 多路采集出现问题。

[复制链接]
3109|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单路AD采集,数据都正确的,多路循环采集时候,AIN2路电压值变掉了。这是为何。。。
沙发
zhuanganwu|  楼主 | 2014-10-28 14:24 | 只看该作者
代码如下:
#include"iostm8s103k3.h"
#define u8 unsigned char
#define u16 unsigned int

u8 voltl=0,templ=0;

void GPIOB_Init()
{
     PB_DDR=0XFF;
     PB_CR1=0X00;
     PB_CR2=0X00;
}
void HSI_8M()
{
       CLK_SWCR|=0x02; //开启切换
       CLK_SWR=0xe1;
       while((CLK_SWCR & 0x01)==0x01);
       CLK_CKDIVR=0x08;//f=f(RC)/2
       CLK_SWCR&=(~0x02); //关闭切换
}
void Init_ADC()
{      
    ADC_CR1  = 0x00;                   //分频系数为4 连续转换模式 先不启动ADC转换      
    ADC_CR2  = 0x38;                   //非外部触发  数据右对齐   禁止扫描模式
    ADC_TDRL|= 0x08;                   //禁止AIN3施密特触发器功能
    ADC_CR1_ADON =1;                 //第一次写1是从低功耗模式唤醒
      
}
void GET_Temp_AD()
{
    ADC_CSR = 0x02;                    //禁止转换结束中断 设置转换通道为AIN2
    ADC_CR1_ADON =1;                   //开启AD转换
   
    while(ADC_CSR_EOC==0);             //等待转换结束
    ADC_CSR&=(~0x80);                  //清除转换结束标志
    temp = ADC_DRH;                    //读出AD转换结果   
    templ = ADC_DRL;
   
}
void GET_Volt_AD()
{
    ADC_CSR = 0x03;                   //禁止转换结束中断 设置转换通道为AIN3
    ADC_CR1_ADON =1;                   //开启AD转换                  
    //ADC_CR1|=0x01;                      //开启AD转换  
    while(ADC_CSR_EOC==0);             //等待转换结束
    ADC_CSR&=(~0x80);                    //清除转换结束标志
    voltl = ADC_DRL;
    volt = ADC_DRH;   //读出AD转换结果     
}
void main(void)
{
  HSI_8M();
  GPIOB_Init();
  Init_ADC();
   while(1)
   {
     GET_Temp_AD();
     GET_Volt_AD();
     GET_Temp();
     GET_Volt();
    }
}

使用特权

评论回复
板凳
saviourxx| | 2014-10-28 14:26 | 只看该作者
不知道你多路怎么采集,没说清楚。
我一般是多路同时采集,然后同时保存到dma配置的一个变量数组上,读数据是通过dma中断,而且不是adc中断。

估计你是一路采完切换到下一路,一路一路切换出问题的吧!~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zhuanganwu + 1 很给力!
地板
zhuanganwu|  楼主 | 2014-10-28 14:30 | 只看该作者
saviourxx 发表于 2014-10-28 14:26
不知道你多路怎么采集,没说清楚。
我一般是多路同时采集,然后同时保存到dma配置的一个变量数组上,读数据 ...

是的,我就是一路采集了,然后数据读取了!然后切换AIN端口,再采集。。

使用特权

评论回复
5
zhuanganwu|  楼主 | 2014-10-28 14:33 | 只看该作者
saviourxx 发表于 2014-10-28 14:26
不知道你多路怎么采集,没说清楚。
我一般是多路同时采集,然后同时保存到dma配置的一个变量数组上,读数据 ...

请问多路同时采集,怎么整,有相应程序吗?

使用特权

评论回复
6
saviourxx| | 2014-10-28 14:35 | 只看该作者
ADC_CR1  = 0x00;                   //分频系数为4 连续转换模式 先不启动ADC转换   
现在设置的是连续转换模式吗?


     GET_Temp_AD();
     GET_Temp_AD();
     GET_Temp_AD();
     GET_Temp_AD();
     GET_Volt_AD();
     GET_Volt_AD();
     GET_Volt_AD();
     GET_Volt_AD();
     GET_Temp();
     GET_Volt();

测试一下这样会不会好点?我很怀疑是切换换出来的问题~
一般工业用的项目代码都是用转换结束中断的,呵呵

使用特权

评论回复
7
saviourxx| | 2014-10-28 14:36 | 只看该作者
ADC_CR1  = 0x00;                   //分频系数为4 连续转换模式 先不启动ADC转换  

还有设置成非连续转换模式,试下!

使用特权

评论回复
8
zhuanganwu|  楼主 | 2014-10-28 14:37 | 只看该作者
saviourxx 发表于 2014-10-28 14:35
ADC_CR1  = 0x00;                   //分频系数为4 连续转换模式 先不启动ADC转换   
现在设置的是连续转 ...

还是一样!!
那个是单次模式,不是连续,我打错了!!

使用特权

评论回复
9
zhuanganwu|  楼主 | 2014-10-28 14:46 | 只看该作者
saviourxx 发表于 2014-10-28 14:36
ADC_CR1  = 0x00;                   //分频系数为4 连续转换模式 先不启动ADC转换  

还有设置成非连续转 ...

AD这样配置,和转换,是不是有问题???
引脚应该没有配置错的!!

void Init_ADC()
{      
    ADC_CR1  = 0x02;                   //分频系数为4 单次转换模式 先不启动ADC转换      
    ADC_CR2  = 0x38;                   //非外部触发  数据右对齐   禁止扫描模式
    ADC_TDRL|= 0x08;                   //禁止AIN3施密特触发器功能
    ADC_CR1_ADON =1;                 //第一次写1是从低功耗模式唤醒
      
}
void GET_Temp_AD()
{
    ADC_CSR = 0x02;                    //禁止转换结束中断 设置转换通道为AIN2
    ADC_CR1_ADON =1;                   //开启AD转换
   
    while(ADC_CSR_EOC==0);             //等待转换结束
    ADC_CSR&=(~0x80);                  //清除转换结束标志
    temp = ADC_DRH;                    //读出AD转换结果   
    templ = ADC_DRL;
   
}
void GET_Volt_AD()
{
    ADC_CSR = 0x03;                   //禁止转换结束中断 设置转换通道为AIN3
    ADC_CR1_ADON =1;                   //开启AD转换                  
    while(ADC_CSR_EOC==0);             //等待转换结束
    ADC_CSR&=(~0x80);                    //清除转换结束标志
    voltl = ADC_DRL;
    volt = ADC_DRH;   //读出AD转换结果   
}

使用特权

评论回复
10
saviourxx| | 2014-10-28 14:56 | 只看该作者
我一般用固件库的,你这样写很难看有没错的~~
ADC_CSR = 0x02;                    //禁止转换结束中断 设置转换通道为AIN2
为什么要禁止转换结束中断?

void GET_Temp_AD()
{
    ADC_CSR = 0x02;                    //禁止转换结束中断 设置转换通道为AIN2
   
加个延时看下!加长点

ADC_CR1_ADON =1;                   //开启AD转换
   
    while(ADC_CSR_EOC==0);             //等待转换结束
    ADC_CSR&=(~0x80);                  //清除转换结束标志
    temp = ADC_DRH;                    //读出AD转换结果   
    templ = ADC_DRL;
   
}
void GET_Volt_AD()
{
    ADC_CSR = 0x03;                   //禁止转换结束中断 设置转换通道为AIN3

加个延时看下!加长点

    ADC_CR1_ADON =1;                   //开启AD转换                  
    while(ADC_CSR_EOC==0);             //等待转换结束
    ADC_CSR&=(~0x80);                    //清除转换结束标志
    voltl = ADC_DRL;
    volt = ADC_DRH;   //读出AD转换结果   
}

使用特权

评论回复
11
saviourxx| | 2014-10-28 15:00 | 只看该作者
void GET_Volt_AD()
{
    ADC_CSR = 0x03;                   //禁止转换结束中断 设置转换通道为AIN3

加个延时看下!加长点

    ADC_CR1_ADON =1;                   //开启AD转换              
A:   
    while(ADC_CSR_EOC==0);             //等待转换结束
B:
还有这里也许没有等待就跳出while了,加个延时看看,最好得知A到B转换的时间是否是你设置的时间
    ADC_CSR&=(~0x80);                    //清除转换结束标志
    voltl = ADC_DRL;
    volt = ADC_DRH;   //读出AD转换结果   
}

使用特权

评论回复
12
zhuanganwu|  楼主 | 2014-10-28 15:39 | 只看该作者
saviourxx 发表于 2014-10-28 15:00
void GET_Volt_AD()
{
    ADC_CSR = 0x03;                   //禁止转换结束中断 设置转换通道为AIN3

偏差越来越大!!:dizzy:

使用特权

评论回复
13
zhuanganwu|  楼主 | 2014-10-28 16:54 | 只看该作者
saviourxx 发表于 2014-10-28 15:00
void GET_Volt_AD()
{
    ADC_CSR = 0x03;                   //禁止转换结束中断 设置转换通道为AIN3

你好,你QQ多少,我发现问题了!!但是很郁闷!!

RX接90K电阻,
PB2/AIN2作为AD采集端口用,但是引脚PB这么配置后,RX两端电压值从4.4,V,瞬间变成2.368V,这是什么问题??求高人帮忙!
void GPIOB_Init()
{
    PB_DDR=0XFF;           PB状态配置这里有问题~~~~
     PB_CR1=0X00;
     PB_CR2=0X00;

}

使用特权

评论回复
14
saviourxx| | 2014-10-30 14:55 | 只看该作者
配置成悬空模拟输入

使用特权

评论回复
15
eng5025| | 2014-10-30 15:05 | 只看该作者
stm8s有DMA吗?

使用特权

评论回复
16
ereck| | 2016-4-1 15:59 | 只看该作者
楼主,解决没有,我也遇到同样问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝