OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3865|回复: 13

关于ADC实验

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-6-28
在线时间
12 小时
发表于 2016-7-9 10:29:33 | 显示全部楼层 |阅读模式
1金钱
小白一只,求各位指点
ADC实验例程里面有段代码是把ADC值按照比例换算成电压
temp=(float)adcx*(3.3/4096);
如果我想换算成频率,我把3.3改成16000后(频率范围是0到16000Hz),得到的结果不对啊,电压是3.3时,频率为2850,不应该是16000吗?
求解释,多谢!

最佳答案

查看完整内容[请看2#楼]

脑洞真的大,楼主。肯定不行的啊。3.3V是ADC参考的基准电压,4096是2的12次方就是12位分辨率,这些跟频率没有任何关系,所以说肯定不能用来测频率,如果照楼主这个想法那我不是测任何东西了么?测频率就用定时器那些啊,有捕获/比较功能的,通用定时器就可以。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
发表于 2016-7-9 10:29:34 | 显示全部楼层
脑洞真的大,楼主。肯定不行的啊。3.3V是ADC参考的基准电压,4096是2的12次方就是12位分辨率,这些跟频率没有任何关系,所以说肯定不能用来测频率,如果照楼主这个想法那我不是测任何东西了么?测频率就用定时器那些啊,有捕获/比较功能的,通用定时器就可以。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复

使用道具 举报

ccbbl梦中人 该用户已被删除
发表于 2016-7-9 10:38:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-6-28
在线时间
12 小时
 楼主| 发表于 2016-7-9 10:46:10 | 显示全部楼层
ccbbl梦中人 发表于 2016-7-9 10:38
测幅和测频是两回事

所以大神怎么办
回复

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-6-28
在线时间
7 小时
发表于 2016-7-9 13:19:15 | 显示全部楼层
你要是想测频率就要使用定时器的输入捕获测量时间就可以得到频率了,用ADC测量模拟转数字信号,频率和幅值是完全不同的两个概念。
回复

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2016-7-9 14:31:05 | 显示全部楼层
ADC是模数转换,怎么测频率= =
一直努力就很好。
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-6-28
在线时间
12 小时
 楼主| 发表于 2016-7-9 15:02:45 | 显示全部楼层
阿祖32 发表于 2016-7-9 14:23
脑洞真的大,楼主。肯定不行的啊。3.3V是ADC参考的基准电压,4096是2的12次方就是12位分辨率,这些跟频率没 ...

我是想用一个声音传感器采集声音,将声信号转化为电信号,经过放大电路后进行AD转换。。。这样行不通?
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-7-8
在线时间
11 小时
发表于 2016-7-9 16:28:56 | 显示全部楼层
mark一下
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
发表于 2016-7-9 19:15:35 | 显示全部楼层
Sun-day 发表于 2016-7-9 15:02
我是想用一个声音传感器采集声音,将声信号转化为电信号,经过放大电路后进行AD转换。。。这样行不通?

将声音信号转换为电信号可以啊,电信号经过电路转换为模拟电压进行AD采集可以啊。但是你怎么能拿AD采样公式去测频率呢。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-6-28
在线时间
12 小时
 楼主| 发表于 2016-7-10 09:57:38 | 显示全部楼层
阿祖32 发表于 2016-7-9 19:15
将声音信号转换为电信号可以啊,电信号经过电路转换为模拟电压进行AD采集可以啊。但是你怎么能拿AD采样公 ...

声音采集传感器是有接收频率范围的,参考电压也是0到3.3V有范围的,我想用公式的比例取估计采集声音的频率,像您说得用定时器捕获测频率,输入信号是是电信号可以吗?
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-7-8
在线时间
11 小时
发表于 2016-7-10 10:22:17 | 显示全部楼层
Sun-day 发表于 2016-7-10 09:57
声音采集传感器是有接收频率范围的,参考电压也是0到3.3V有范围的,我想用公式的比例取估计采集声音的频 ...

可以的 捕获是对电信号的上升沿或下降沿捕获 由此可以得到一段时间内的脉冲数,就能算出频率了 刚做完频率计 表示捕获功能真的很好用
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-6-28
在线时间
12 小时
 楼主| 发表于 2016-7-10 10:43:48 | 显示全部楼层
leover6 发表于 2016-7-10 10:22
可以的 捕获是对电信号的上升沿或下降沿捕获 由此可以得到一段时间内的脉冲数,就能算出频率了 刚做完频 ...

可以把源码贴上来吗,不胜感激!
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-7-8
在线时间
11 小时
发表于 2016-7-11 20:49:35 | 显示全部楼层
都是自己凭感觉写的 可能比较乱 也不规范 见谅哈
用的是等精度方法测频率 开了2个定时器 TIM2作为预阀门信号,TIM3作为实际阀门信号,用捕获通道1捕获待测信号,计数脉冲。

//                        32位控制&计数变量 state_cnt                        //
//        32:26                25                        24                        23-0        //
//        保留                valve                busy                cnt                //
u32 state_cnt;

                 

/****************TIM3中断服务函数****************/
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3, TIM_FLAG_CC1))
        {
                switch(state_cnt&(1<<25))
                {
                        case 0:
                                switch(state_cnt&(1<<24))
                                {
                                        case 0:
                                                state_cnt = (1<<25)|(1<<24) + 1;                //valve = 1, busy = 1, cnt = 0
                                                TIM3->CNT = 0;
                                                TIM_Cmd(TIM3, ENABLE);                                        //打开基准信号定时器
                                                break;
                                        default:
                                                TIM_Cmd(TIM3, DISABLE);                                        //关闭基准信号定时器
//                                                state_cnt &= ~(1<<24);                                        //把忙标志清除和计算freq放在按键的中断函数里,提升捕获中断函数的效率
                                                break;
                                }
                                break;
                        default:
                                state_cnt++;
                }
                TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update);
        }
}

/****************TIM2中断服务函数****************/
void TIM2_IRQHandler(void)   
{
        if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
                if(temp == 0)                //加入这段代码消除打开更新中断时立即进入中断的影响
                        temp++;
                else
                        state_cnt &= ~(1<<25);                //发出关闭实际阀门的信号               
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        }
}

回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-6-28
在线时间
12 小时
 楼主| 发表于 2016-7-13 10:34:12 | 显示全部楼层
leover6 发表于 2016-7-11 20:49
都是自己凭感觉写的 可能比较乱 也不规范 见谅哈
用的是等精度方法测频率 开了2个定时器 TIM2作为预阀 ...

感谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-9-11 14:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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