打印
[STM8]

请教一个基础问题,关于ADC 数据位数的

[复制链接]
2698|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
木子不二|  楼主 | 2016-6-30 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int ADCData;
unsigned char ADCBuff[6];

/*******************************************************************************
**函数名称:void ADC_Data_Read(unsigned int *AD_Value)
**功能描述:读取ADC完成一次模数转换结果
**入口参数:unsigned int *AD_Value
            *AD_Value ->读取ADC采样数据的指针
**输出:无
*******************************************************************************/
void ADC_Data_Read(unsigned int *AD_Value)
{
  ADC_CR1_bit.ADON = 1;       //启动ADC

  while(ADC_CSR_bit.EOC == 0);  //等待转换结束
  *AD_Value = ADC_DRH;          //先读取高8位
  *AD_Value = (unsigned int)((*AD_Value << 8) + ADC_DRL);   //高8位与低8位相加,凑成16位数据
}
/*    主函数    */
int main(void)
{
  asm("sim");             //关闭系统总中断
  CLK_CKDIVR = 0x00;      //CPUDIV = 1 HSIDIV = 1  内部时钟 = 16Mhz
  UART1_Init(9600);       //调用串口初始化函数,并设置波特率为9600 bps
  ADC_Init();             //调用ADC初始化函数
  Timer4Init();           //初始化定时器4
  asm("rim");             //打开系统总中断  
  while(1)
  {
    if(adcflag == 1)                        //1秒定时时间到对使能ADC进行采样
    {
      asm("sim");                           //关系统总中断
      ADC_Data_Read(&ADCData);              //读取ADC的采样数值
      Uart_SendString("ADC_DATA = " , 11);  //发送字符串"ADC_DATA = "
      ADCBuff[3] = ADCData % 10 + '0';      //转换成ASCII码
      ADCBuff[2] = ADCData % 100 / 10 + '0';
      ADCBuff[1] = ADCData / 100 % 10 + '0';
      ADCBuff[0] = ADCData / 1000 + '0';
      ADCBuff[4] = 0x0d;                    //换行字符
      ADCBuff[5] = 0x0a;
      Uart_SendString(ADCBuff , 6);         //向PC机发送ADC采样数值
      adcflag = 0;                          //ADC采样标志清除
      asm("rim");                           //开系统总中断,准备下次ADC采样
    }
  }
}

这是例程代码。这段代码中的定义的ADCData 是8位的。可是把adc 转换后的数据8+8位放到&ADCData这个地址,这还能理解,在主函数里面直接把ADCData来转换为十进制这样不对吧。
沙发
木子不二|  楼主 | 2016-6-30 16:52 | 只看该作者
还有一个问题为什么STM8S是8位数据,ADC转换的数据位数是大于8位的

使用特权

评论回复
板凳
Xflyan| | 2016-6-30 17:19 | 只看该作者
unsigned int ADCData,谁告诉你这个值是8位的?

使用特权

评论回复
地板
popeye021| | 2016-6-30 17:19 | 只看该作者
木子不二 发表于 2016-6-30 16:52
还有一个问题为什么STM8S是8位数据,ADC转换的数据位数是大于8位的

stm8s的adc貌似是10位的,具体怎么样自己去看datasheet。
main函数里面只是把adc数据转换成ascii码,再从串口发送给PC。
你自己把程序跑一边,看看过程中的数据,以及最后PC显示的结果,就理解了。

使用特权

评论回复
5
木子不二|  楼主 | 2016-6-30 17:37 | 只看该作者
Xflyan 发表于 2016-6-30 17:19
unsigned int ADCData,谁告诉你这个值是8位的?

16位的,我错了

使用特权

评论回复
6
木子不二|  楼主 | 2016-6-30 17:41 | 只看该作者
听你们说下,这样好理解点了,这个ADC是10位的,数据就是10位,右对齐就是8位放低寄存器,2位放高寄存器。
,那这个转换程序是否可以改成这样不用指针变量,
void ADC_Data_Read(unsigned int AD_Value)
{
  ADC_CR1_bit.ADON = 1;       //启动ADC

  while(ADC_CSR_bit.EOC == 0);  //等待转换结束
  AD_Value = ADC_DRH;          //先读取高8位
  AD_Value = (unsigned int)((*AD_Value << 8) + ADC_DRL);   //高8位与低8位相加,凑成16位数据
}

使用特权

评论回复
7
Xflyan| | 2016-6-30 18:53 | 只看该作者
木子不二 发表于 2016-6-30 17:41
听你们说下,这样好理解点了,这个ADC是10位的,数据就是10位,右对齐就是8位放低寄存器,2位放高寄存器。
...

不用指针变量,没有return这个函数怎么把数据传出去?内部赋值完成就结束了,按照优化规则,函数内部两行可以直接给忽略了

使用特权

评论回复
8
Rangar| | 2016-6-30 20:47 | 只看该作者
设置断点,查看寄存器的值,能看地直观

使用特权

评论回复
9
diweo| | 2016-6-30 20:53 | 只看该作者
木子不二 发表于 2016-6-30 17:41
听你们说下,这样好理解点了,这个ADC是10位的,数据就是10位,右对齐就是8位放低寄存器,2位放高寄存器。
...

这里的AD_Value是你调用的时候传进来的复制品。它是一个临时的变量,可以赋值和运算,但是函数返回时不会影响原来的值。
用指针就不一样了,虽然指针也是一个复制品,但它所指向的地址是实实在在的,通过它就可以操作到的。就是说这里改变的是指针指向的内容,而不是指针本身。

使用特权

评论回复
10
aerwa| | 2016-6-30 23:46 | 只看该作者
不用指针变量也可以啊,那个左移8位的*已经是多余的了去掉仿真测试看看。

使用特权

评论回复
11
戈卫东| | 2016-7-1 00:02 | 只看该作者
转换成人类可以阅读的形式而已。。。。。

使用特权

评论回复
12
robter| | 2016-7-1 09:23 | 只看该作者
很好很好,值得学习的经验

使用特权

评论回复
13
木子不二|  楼主 | 2016-7-1 11:21 | 只看该作者
Xflyan 发表于 2016-6-30 18:53
不用指针变量,没有return这个函数怎么把数据传出去?内部赋值完成就结束了,按照优化规则,函数内部两行 ...

加函数 return 返回 就OK了

使用特权

评论回复
14
Thethree| | 2016-7-2 21:24 | 只看该作者
这应该没啥吧,换成十进制是不是想要显示呢?

使用特权

评论回复
15
木子不二|  楼主 | 2016-7-3 00:16 | 只看该作者
通过各位的解说基本明白了,程序也搞定了

使用特权

评论回复
16
laoxianccc| | 2016-7-3 10:00 | 只看该作者
STM8S是8位单片机,也就是每个寄存器大小定义为8位的,但是ADC是10位的,采用了两个寄存器,所以就与ADC高位寄存器和低位寄存器两次操作,如果是16位或32位单片机那么寄存器大小就是16位或32位的,可以一次性全部操作了,至于(unsigned int)是我们自己定义的,和单片机是几位的关系不大。

使用特权

评论回复
17
ideafor| | 2016-7-3 21:40 | 只看该作者
我想实现adc采集的数据直接给dac输出,那么输入和输出之间的误差有多大?

使用特权

评论回复
18
木子不二|  楼主 | 2017-1-16 10:16 | 只看该作者
ideafor 发表于 2016-7-3 21:40
我想实现adc采集的数据直接给dac输出,那么输入和输出之间的误差有多大?

我也不知道哈哈

使用特权

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

本版积分规则

36

主题

306

帖子

6

粉丝