找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6378|回复: 28
收起左侧

关于单片机ADC如何对正弦波信号的采样?

[复制链接]
ID:898834 发表于 2021-7-26 15:54 | 显示全部楼层 |阅读模式
利用stc8a8k单片机自带的ADC如何进行正弦波信号的采样?
回复

使用道具 举报

ID:462768 发表于 2021-7-26 20:44 | 显示全部楼层
电流转换成电压,这个过程和电容充电类似,电容电越多,电压越高,然后比如用电压触发器,高到一个程度就触发打开另一个电容,这些电容都是像秤砣一样实现测量好的。

电压转换成频率,有一个集成电路叫做压控振荡器,这个振荡器的频率是用电压高低来决定的,然后
电压就转换成了频率,这个频率就可以通过译码器翻译成数字信号。


评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:419909 发表于 2021-7-26 21:09 | 显示全部楼层
参照STC官网例程就行。任何波形都一样的。差别在于你要什么样的数据。
回复

使用道具 举报

ID:898834 发表于 2021-7-26 21:31 | 显示全部楼层
wfqxgw 发表于 2021-7-26 21:09
参照STC官网例程就行。任何波形都一样的。差别在于你要什么样的数据。

我采集的数据浮动很大,输入直流电就完全没问题,输入交流正弦波就有很大的差别
回复

使用道具 举报

ID:898834 发表于 2021-7-26 21:31 | 显示全部楼层
m2006410 发表于 2021-7-26 20:44
电流转换成电压,这个过程和电容充电类似,电容电越多,电压越高,然后比如用电压触发器,高到一个程度就触 ...

用单片机自带ADC如何实现呢
回复

使用道具 举报

ID:401564 发表于 2021-7-26 21:32 | 显示全部楼层
"进行正弦波信号的采样"
你这是要干嘛呢?这ADC是有严谨的逻辑的,不是说"我出去吃个饭",然后你可以点个外卖,也可以吃烧烤,来碗螺狮粉也行的
这正弦波有:频率,峰-峰值,平均值,有效值(220V市电说的就是有效值),多点采样(玩音响用得到,可以叫频谱显示)
还有一个是要精密整流之后的数据,那玩意没玩过,不好说
那么,你现在是要采什么样呢?
回复

使用道具 举报

ID:898834 发表于 2021-7-26 21:35 | 显示全部楼层
Y_G_G 发表于 2021-7-26 21:32
"进行正弦波信号的采样"
你这是要干嘛呢?这ADC是有严谨的逻辑的,不是说"我出去吃个饭",然后你可以点个外卖 ...

是要对正弦波的有效值进行采样,频率为1Khz,幅度为0-50mv的正弦波进行采样
回复

使用道具 举报

ID:893692 发表于 2021-7-27 02:22 | 显示全部楼层
zqz1345444061 发表于 2021-7-26 21:31
我采集的数据浮动很大,输入直流电就完全没问题,输入交流正弦波就有很大的差别

对啊 交流采样信号就是这样,采集交流的时候你要考虑抬升信号的电位,不然负半轴的电压无法采集到
回复

使用道具 举报

ID:419909 发表于 2021-7-27 09:13 | 显示全部楼层
zqz1345444061 发表于 2021-7-26 21:35
是要对正弦波的有效值进行采样,频率为1Khz,幅度为0-50mv的正弦波进行采样

纯交流波形的话。因为正负半周是对称的。如果对精度要求不高。精度为全波的1半,可以不采集负半周的也行。从正半周那里取数据计算就行了。有交值就是至少在连续采集1个正弦波周期内的信号值。然后取最大的ADC值*2,即为峰-峰值,再通过峰-峰值换算公式转成有效值。具体换算公式可百度
回复

使用道具 举报

ID:898834 发表于 2021-7-27 09:43 | 显示全部楼层
wfqxgw 发表于 2021-7-27 09:13
纯交流波形的话。因为正负半周是对称的。如果对精度要求不高。精度为全波的1半,可以不采集负半周的也行 ...

我用信号发生器输出了一个频率为1kHZ,最大值为3V,最小值为1V的正数正弦波,用ADC采集到的数据依旧波动很大
回复

使用道具 举报

ID:898834 发表于 2021-7-27 09:44 | 显示全部楼层
m24 发表于 2021-7-27 02:22
对啊 交流采样信号就是这样,采集交流的时候你要考虑抬升信号的电位,不然负半轴的电压无法采集到

我用信号发生器输出了一个频率为1kHZ,最大值为3V,最小值为1V的正数正弦波,用ADC采集到的数据依旧波动很大
回复

使用道具 举报

ID:169891 发表于 2021-7-27 09:54 | 显示全部楼层
你的采样速度是多少呢,能正确反应1KHZ的信号吗
回复

使用道具 举报

ID:898834 发表于 2021-7-27 10:29 | 显示全部楼层
ljfljfljf123 发表于 2021-7-27 09:54
你的采样速度是多少呢,能正确反应1KHZ的信号吗

我选择的是416个系统时钟转换一次
回复

使用道具 举报

ID:419909 发表于 2021-7-27 10:45 | 显示全部楼层
zqz1345444061 发表于 2021-7-27 09:43
我用信号发生器输出了一个频率为1kHZ,最大值为3V,最小值为1V的正数正弦波,用ADC采集到的数据依旧波动 ...

下面代码仅供参考,不一定能运行,随便打的.如有不当.请指正.只是方便说明编程思路.
unsigned int get VRMS()
{
unsigned int i;
unsigned int tem,max=0;
for(i=0;i<1000;i++)  //循环1000次.这个次数根据实际情况设置.一般要>=一个波形周期的时间.比如1KHz的
                               //单个周期就是1/1000=1ms,保证循环时间大于1ms就行了.
  {
     tem=Get_ADC_value();  //取ADC值
     if(tem>max) max=tem; //这个周期内的最大值即峰-峰值.
  }
max=max*2;//因为只采集了正半周期的波形.所以一个全波的峰峰值即加上负半周信号*2
max=max/2.828  //  峰_峰值求RMS值公式:RMS=Peak_Peak/sqrt(8),为方便计算.直接写上了sqrt(8)=2.828
return max;   //返修RMS值.注意这个只是ADC值.再根据实际情况换算成标准电压就行.比如参考电压是5V,那就是:5/4095*max
}
回复

使用道具 举报

ID:898834 发表于 2021-7-27 11:04 | 显示全部楼层
wfqxgw 发表于 2021-7-27 10:45
下面代码仅供参考,不一定能运行,随便打的.如有不当.请指正.只是方便说明编程思路.
unsigned int get VRM ...

多谢,我参考一下方法
回复

使用道具 举报

ID:898834 发表于 2021-7-27 11:29 | 显示全部楼层
wfqxgw 发表于 2021-7-27 10:45
下面代码仅供参考,不一定能运行,随便打的.如有不当.请指正.只是方便说明编程思路.
unsigned int get VRM ...

这个程序适用于一个周期全为正的正弦波吗,不存在负半周为负
回复

使用道具 举报

ID:419909 发表于 2021-7-27 12:58 | 显示全部楼层
zqz1345444061 发表于 2021-7-27 11:29
这个程序适用于一个周期全为正的正弦波吗,不存在负半周为负

全为正的话。那就去掉max*2就行。
回复

使用道具 举报

ID:401564 发表于 2021-7-27 13:06 | 显示全部楼层
为什么学单片机的教程都会有说到要学习模拟电路基础的呢
你一个正弦波,不管有没有负半周,它的电压都是在变化的,那么,单片机ADC只是一段时间内(就是ADC转换时间)的电压,每次转换的时间不同,电压也会不同,波动就是这么来的
你肯定要有一个滤波电路的
我没有具体的做过50mV的,所以,不知道要不要精密整流(不是整流,精密整流是一个绝对值电路),还要加一个滤波电路,这样就得到一个峰值,想要有效值,还得再除以根号2
自己上网先学一下吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:419909 发表于 2021-7-27 13:47 | 显示全部楼层
抛开模拟电路基础,要求一个RMS,(也就是有效值,通俗地说,就是万用表打到AC档。再测试正弦波交流电压的值。),只需要知道峰_峰值即可,然后通过公式再求其它平均值也有,有效值也好。就很容易。
什么是峰_峰值?就是一个周期内波形的最高点与最低点的值。所以上面的程序重点就是找到这个周期内(不断循环取ADC值)的最高点,即峰_峰值,那么再换算成其它就容易了。就像一个圆。知道了R半径,再求其它面积,周长什么的。就容易了。
对于要求不高的场合,直接用一个4.7uf的电容偶合输入到单片机的ADC引脚即可,这种方法相对简单。只能采集正半周。可以用于实验。如果在应用场合,那就要根据情况再加缓冲,放大或者隔离,滤波电路了。主要是防止受干扰。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:313048 发表于 2021-7-27 14:02 | 显示全部楼层
ADC采样实际上你只要电压对,采样速率够,按道理是不会出现你说的那些情况,而且看上面那些楼说的前面并一个电容啥的,这种只针对直流信号好一点,交流不建议并电容,这样无法反应信号的真实完整性。而且你不能直接把信号发射器产生的信号直接怼到单片机的ADC引脚,该信号应该电阻到地才对,同时,如果信号发生器产生的是正负电压的,你要把他通过运放或者其他别的东西将其偏移到正电压,或者采用差分采样的方式进行采样才可得到正确的电压

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:898834 发表于 2021-7-27 14:48 | 显示全部楼层
Y_G_G 发表于 2021-7-27 13:06
为什么学单片机的教程都会有说到要学习模拟电路基础的呢
你一个正弦波,不管有没有负半周,它的电压都是在变 ...

好的好的,感谢指导
回复

使用道具 举报

ID:898834 发表于 2021-7-27 14:49 | 显示全部楼层
wfqxgw 发表于 2021-7-27 13:47
抛开模拟电路基础,要求一个RMS,(也就是有效值,通俗地说,就是万用表打到AC档。再测试正弦波交流电压的 ...

多谢指导
回复

使用道具 举报

ID:898834 发表于 2021-7-27 19:35 | 显示全部楼层
AUG 发表于 2021-7-27 14:02
ADC采样实际上你只要电压对,采样速率够,按道理是不会出现你说的那些情况,而且看上面那些楼说的前面并一 ...

可是交流正弦波每一个时刻的电压值是不同的,是需要进行多次采样取最大值叭
回复

使用道具 举报

ID:898834 发表于 2021-7-27 19:43 | 显示全部楼层
wfqxgw 发表于 2021-7-27 10:45
下面代码仅供参考,不一定能运行,随便打的.如有不当.请指正.只是方便说明编程思路.
unsigned int get VRM ...

这个程序逻辑我觉得没错,但是今天测试了以下,测量结果跟实际仍旧不同
回复

使用道具 举报

ID:419909 发表于 2021-7-27 21:28 | 显示全部楼层
本帖最后由 wfqxgw 于 2021-7-27 21:33 编辑

以下输入电路供参考。另外。转换数据时注意变量类型。有小数点的。要用float.这里要注意,实际交流电压是R6的5k6电阻上面的。先用万用表测试出实际值。再用单片机验证,如果电压不高。1K限流电阻可以暂时不用。主要是用于验证数据。
adc.JPG
回复

使用道具 举报

ID:401564 发表于 2021-7-27 22:10 | 显示全部楼层
本帖最后由 Y_G_G 于 2021-7-28 09:06 编辑
zqz1345444061 发表于 2021-7-27 19:43
这个程序逻辑我觉得没错,但是今天测试了以下,测量结果跟实际仍旧不同

怎么就觉得这个逻辑可行了呢?
unsigned int tem,max=0;
for(i=0;i<1000;i++)  //循环1000次.这个次数根据实际情况设置.一般要>=一个波形周期的时间.比如1KHz的
                               //单个周期就是1/1000=1ms,保证循环时间大于1ms就行了.
  {
     tem=Get_ADC_value();  //取ADC值
     if(tem>max) max=tem; //这个周期内的最大值即峰-峰值.
  }
你不觉得max的值就远是0吗? if(tem>max) 里面的表达式有什么意思呢?
还有就是:5/4095*max,你去看一下数据手册,人家是要/4096的,这种公式在12位ADC可能没有什么问题
但如果是多次采样进行平均或者相加,误差就大了
没看仔细,这是个坛循环,我还以为是中断了,前面我的理解错了
回复

使用道具 举报

ID:419909 发表于 2021-7-27 22:25 | 显示全部楼层
zqz1345444061 发表于 2021-7-27 19:43
这个程序逻辑我觉得没错,但是今天测试了以下,测量结果跟实际仍旧不同

连接原理图。供参考。R8的1K电阻是限流电阻,ADC实际测试的交流电压是R6的5K6电阻上的交流电压。所以先用万用表测试好R6上的电压。再在单片机上验证就行。注意。单片机在转换为电压时。变量类型要用float.比如 float Vin=5/4096*get VRMS();
adc.JPG
回复

使用道具 举报

ID:313048 发表于 2021-7-28 10:20 | 显示全部楼层
zqz1345444061 发表于 2021-7-27 19:35
可是交流正弦波每一个时刻的电压值是不同的,是需要进行多次采样取最大值叭

连续采样的过程中,你是将整个波形的电压信号都给采样了,最大值也包括在里面。除非你一个信号周期里面的采样点非常少,那么有可能采不到最高电压,所以这跟你的采样速率有关系,假如你一个信号周期里面有100个采样点,那么完完全全可以采样到最高值。
回复

使用道具 举报

ID:883242 发表于 2021-7-28 19:44 | 显示全部楼层
纯正弦波可以先精密整流然后滤波成直流来测试。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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