硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6829|回复: 5
收起左侧

[有问必答] ADC采样和滤波例程——例程006

[复制链接]

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
发表于 2015-4-22 16:27:43 | 显示全部楼层 |阅读模式
第一个问题
#define SAMP_COUNT    20        /* 样本个数,表示200ms内的采样数据求平均值 */
main函数中为    bsp_StartTimer(1, 300);    /* 定时器0周期 200毫秒 */
这个不是设置的300啊,是注释写错啦吗?
每300mS取20个转后数据采样值并且输出,这么理解对吗???

第二个问题


uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  /* Return the selected ADC conversion value */
  return (uint16_t) ADCx->DR;
}
这里给我通俗的讲一下CPU如何实现这个转后过程的???
检测一个(0——3.6V模拟电压)后,如何得到一个12bit的数据,难道是2^12=3.6V这样对应转换吗???不解
转换后的值应该是直接就放进ADCx->DR这个寄存器吧?


第三个问题


/*
*********************************************************************************************************
*    函 数 名: AdcPro
*    功能说明: ADC采样处理,插入1ms systick中断进行调用
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
void AdcPro(void)
{
    static uint16_t buf[SAMP_COUNT];
    static uint8_t write;
    uint32_t sum;
    uint8_t i;

    buf[write] = ADC_GetConversionValue(ADC1);
    if (++write >= SAMP_COUNT)
    {
        write = 0;
    }

    /* 下面这段代码采用求平均值的方法进行滤波
        也可以改善下,选择去掉最大和最下2个值,使数据更加精确
    */
    sum = 0;
    for (i = 0; i < SAMP_COUNT; i++)
    {
        sum += buf;
    }
    g_usAdcValue = sum / SAMP_COUNT;    /* ADC采样值由若干次采样值平均 */

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);    /* 软件启动下次ADC转换 */
}

1.这个程序是每1mS进来一次吧???
2.buf[write] = ADC_GetConversionValue(ADC1);
这句是每1mS赋值一次给buf[write]还是每1mS赋值一次给buf[write]至少20以上的值???
爱好&偏执
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2015-4-22 17:25:31 | 显示全部楼层
1. 每个程序都有个《例程说明(中文).txt》这个文件,操作前你都可以看一下,你的理解是对的。
2. 通过ADC_SoftwareStartConvCmd(ADC1, ENABLE);    /* 软件启动下次ADC转换 */ 启动一次,采样一次。
    注意ADC的采样范围,最多只能0-3.3V。如果外部接了模拟电路可以其它范围的采集,比如V3板子上面带的模拟前端。
3. 是的,1ms进来一次,每1mS赋值一次给buf[write]。
   
    嘀嗒定时器的初始化通过这个函数:


/*
        配置systic中断周期为1ms,并启动systick中断。
        这个函数在 \\Libraries\\CMSIS\\CM3\\CoreSupport\\core_cm3.h
        
        Systick中断向量在(\\Libraries\\CMSIS\\CM3\\DeviceSupport\\ST\\STM32F10x\\startup\\arm\\
            startup_stm32f10x_hd.s 文件中定义为 SysTick_Handler。
        SysTick_Handler函数的实现在stm32f10x_it.c 文件。
        SysTick_Handler函数调用了SysTick_ISR()函数,在本文件末尾。
    */   
    SysTick_Config(SystemCoreClock / 1000);
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-22 22:19:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 每个程序都有个《例程说明(中文).txt》这个文件,操作前你都可以看一下,你的理解是对的。
2. 通过ADC_SoftwareStartConvCmd(ADC1, ENABLE);    /* 软件启动下次ADC转换 */ 启动一次,采样一次。
    注意ADC的采样范围,最多只能0-3. .. (2015-04-22 17:25) 
[s:130][s:151]我在看看,谢谢啊!
爱好&偏执
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-23 09:12:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 每个程序都有个《例程说明(中文).txt》这个文件,操作前你都可以看一下,你的理解是对的。
2. 通过ADC_SoftwareStartConvCmd(ADC1, ENABLE);    /* 软件启动下次ADC转换 */ 启动一次,采样一次。
    注意ADC的采样范围,最多只能0-3. .. (2015-04-22 17:25) 
2.  你说的V3板子上面带的模拟前端是那个芯片还是那一块电路???
      
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  /* Return the selected ADC conversion value */
  return (uint16_t) ADCx->DR;
}
这段程序我主要是想了解CPU怎么处理模拟信号的转换,然后转换后的数据存入ADCx->DR这个寄存器???
12bit逐次逼近怎么理解?假如模拟2.0V存入ADCx->DR为值:X;假如模拟为3.3V出入ADCx->DR的值为Y;这里X与Y的值大概是怎么得到的??
爱好&偏执
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2015-4-23 09:16:05 | 显示全部楼层

回 heqin 的帖子

heqin:2.  你说的V3板子上面带的模拟前端是那个芯片还是那一块电路???
      
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
{
....... (2015-04-23 09:12) 
1. 示波器的那块。
2. 这个是芯片内部的工作部分,我们不知道的,我们要做的就是读取寄存器获取数值即可。
    另外这个ADC好像用的是逐次逼近型ADC,你可以查阅资料了解下工作原理。
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-23 09:33:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 示波器的那块。
2. 这个是芯片内部的工作部分,我们不知道的,我们要做的就是读取寄存器获取数值即可。
    另外这个ADC好像用的是逐次逼近型ADC,你可以查阅资料了解下工作原理。 (2015-04-23 09:16) 
[s:151],好的,谢谢你的内心解答!
爱好&偏执
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 22:18 , Processed in 0.238215 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表