问题标签 [adc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
659 浏览

microcontroller - ADC 传递函数

我从很久以前离开的人那里接手了这个项目。

我现在正在查看 ADC 模块,但我不明白代码的含义。

Process: Reading volts(0 ~ +10v) --> Amplifier(INA114) --> AD7609.

这是代码:

  1. 完成转换后存储的 8 个通道data[9]
  2. 将数据转换为微伏?

    //convert to microvolts and store the readings // unsigned long temp[], data[] temp[0] = ((data[0]<<2)& 0x3FFFC) + ((data[1]>>14)& 0x0003); temp[1] = ((data[1]<<4)& 0x3FFF0) + ((data[2]>>12)& 0x000F); temp[2] = ((data[2]<<6)& 0x3FFC0) + ((data[3]>>10)& 0x003F); temp[3] = ((data[3]<<8)& 0x3FF00) + ((data[4]>>8)& 0x00FF); temp[4] = ((data[4]<<10)& 0x3FC00) + ((data[5]>>6)& 0x03FF); temp[5] = ((data[5]<<12) & 0x3F000) + ((data[6]>>4)& 0x0FFF); temp[6] = ((data[6]<<14)& 0x3FFF0) + ((data[7]>>2)& 0x3FFF); temp[7] = ((data[7]<<16)& 0x3FFFC) + (data[8]& 0xFFFF);

我不明白这些代码在做什么......?我知道它会发生变化,但它们如何成为微数据格式?

  1. 转换功能

//store the final value in the raw data array adstor[] adstor[i] = (signed long)(((temp[i]*2000)/131072)*10000);

131072 = 2^(18-1)我不知道其他值来自哪里

AD7609 datasheet 说The FSR for the AD7609 is 40 V for the ±10 V range and 20 V for the ±5 V range,所以我猜他选择20v了上面描述的,它不知何故变成了2000???

有没有人有任何线索?

谢谢

-------------------从这里更新的问题----------

在 ADC 传递函数之后,我不知道数据 [0] 的 18 位连接值 + 数据 [1] 的 16 位连接值如何变成微伏。

数据[9] +---+---+--- +---+---+---+---+---+---++---+---+---++---+---+---++
analog volts | 1.902v | 1.921v | 1.887v | 1.934v | +-----------++-----------+------------+------------+------------+
digital value| 12,464 | 12,589 | 12,366 | 12,674 | +---+---+---++---+---+---++---+---+---++---+---+---++---+---+---+

data[3:0] 1 resolution = 20v/2^17-1 = 152.59 uV/bit我只是举一个例子1.902v/152.59uv = 12,464

现在通过串联获得:

temp[0] = ((data[0]<<2)& 0x3FFFC) + ((data[1]>>14)& 0x0003) = C2C0

temp[1] = ((data[1]<<4)& 0x3FFF0) + ((data[2]>>12)& 0x000F) = 312D3

temp[2] = ((data[1]<<6)& 0x3FFC0) + ((data[3]>>10)& 0x003F) = 138C

然后将它们放入传递函数并得到微伏

adstor[i] = (signed long)(((temp[i]*2000)/131072)*10000);

adstor[0]= 7,607,421 with temp[0] !=1.902*e6

adstor[1]= 30,735,321 with temp[1] != 1.921*e6

adstor[2]= 763,549 with temp[2]

如您所见,它们与表中的模拟值完全不同。

我不明白为什么 data 需要移位和<<>>并加起来两个 data[]??

谢谢,

0 投票
0 回答
1257 浏览

uart - Nordic 评估板上带有 UART 的 ADC 示例

我前两天买了nordic评估板。我一直在搜索论坛以启用和测试电池的电压水平并通过 UART 对其进行监控。经过几个小时的跟踪和错误。我设法将两个北欧示例合二为一,但我无法在我的 UART 上看到电压电平。你们能给我提供一个使用UART作为输出的ADC示例吗?我会做剩下的。

谢谢

编辑:

0 投票
1 回答
98 浏览

avr - 浮点运算异常

我正在使用 atmega2560 从温度传感器 tmp36 读取温度。在读取温度传感器数字值并将它们转换为两个 atmega2560 微控制器中的可读形式后,我得到了不同的答案。为什么我会得到这样的答案。? 一段代码如下:

我得到的一个 ATMEGA2560 答案是:

temp_buf:55,temp_volt:447,temp:22.4

在另一个 ATMEGA2560 上,我得到的是:

temp_buf:53,temp_volt:-861,temp:0.00

正因为如此,我做了这个调整

当我使用相同的代码时,为什么两个微控制器的行为不同?

0 投票
1 回答
438 浏览

arduino - 必须延迟 adc

我试图通过串口将模拟信号从arduino发送到计算机。为了获得输入模拟信号的最大样本,我将波特率设置为最大限制。代码如给定

该程序适用于我的频率非常低的信号。但在较高频率的信号中,仍然会出现混叠问题。我尝试减少延迟。我得到了更多样本当我这样做时,但我得到了一些数字值不能使用,也就是说,一些错误的数字值是353?12等等。是否必须给ADC提供 1 毫秒的最小延迟?或者有什么办法可以增加我的样本故事

0 投票
1 回答
1413 浏览

java - 如何在安卓手机上直接访问adc和dac?

我正处于一个项目的开始阶段,我将尝试为 Android 制作助听器应用程序。我在 Pure Data、C 声音和基本的 Android 声音库中编写了一些补丁,这些声音库基本上从麦克风获取输入并通过耳机播放。没有过滤或放大。

虽然 Csound 提供了最佳性能,但延迟使工具无法使用。我知道 Android L 应该会有所帮助,但我的目标是创建一个低成本的助听器设备。所以旧手机可能不会得到它。

下一个想法是看看我是否可以直接访问 adc 和 dac 值,然后使用 C 使用 NDK 制作我自己的 AudioTrack 和音频记录版本。基本上指向这些值进入的内存位置。

这可能吗?还有我应该研究什么?我在网上找不到任何关于直接访问 DAC 和 ADC 的信息。

感谢您的时间。

0 投票
1 回答
73 浏览

android - 如何让 eclipse adc 看到我的手机?

我正在尝试在真正的硬件手机上运行我的应用程序。

我安装了 adb,我尝试杀死服务器,然后启动服务器,每次我编写 adb 设备时,我的设备都显示正常。

然后我去 Eclipse 中的 DDMS,我的手机也可以正常连接,我什至可以从我的显示器上截取屏幕截图。

但是当我想运行我的应用程序时,弹出(Android 设备选择器)窗口是空的。那里只有虚拟机。

我在我的 Windows PC 上做了这个,它运行良好,我能够运行我的应用程序。我多次重新安装 Eclipse,但没有运气。

0 投票
1 回答
591 浏览

assembly - Atmega328p ADC 组件无法转换

这是我的代码。我需要在板上放置一个上拉电阻,以便 INT0 标志将我发送到转换,然后在 PORTB 上打印它。我在 PC0 上使用 ADC0,但它不起作用。PORTB 上只打印了一个值。你能帮助我吗?

0 投票
1 回答
1191 浏览

binary - 使用整数将 8 位二进制转换为 BCD

好的,大家好,我在 VHDL 中尝试做的是取一个 8 位二进制值并将其表示为 BCD,但有一个问题,因为这个值必须是最大输入 9 的一小部分。

1- 将输入转换为整数,例如 1000 0000 -> 128

2- 将整数除以 255 然后乘以 90( 90 以便我得到一个数字和小数点后的第一个数字都在小数点后)

例如 128/255*90 = 45.17(假设为 signal_in)

3.通过除以 20 提取 45 的两位数并将它们存储为单独的整数,例如我会使用类似的东西:

LSB_int = signal_in mod 10

然后我将信号除以 10,因此将其更改为 4.517,然后让它等于 MSB_int ..(这将截断小数并存储 4 正确)

4.将LSB_int和MSB_int都转换为4位BCD

..从那里我会是完美的......但遗憾的是我遇到了很多麻烦......使用不同的数据类型(签名无符号std_logic_vectors)和除法。所以我只需要帮助解决我思维过程中的任何缺陷和我应该做的事情做这个的时候要注意..

我实际上已经完成了我的代码并认为我保存了这个..但我没有,而且我仍然相信这个解决方案可以工作我会用我认为是我的旧代码来回复......只要我能记住这一切..

这是我的新代码的另一个问题..(只是为了表明我确实做了一些事情..) 在 VHDL 中将 8 位二进制数转换为 BCD

0 投票
1 回答
754 浏览

linux - 使用 ADC 生成正弦波

我的板上有一个 adc 模块。我在信号发生器上创建一个正弦波。我将此发生器的输出提供给 adc 引脚。最后我定期读取此引脚的值。我尝试在我的软件上创建一个正弦波。

而且我不使用 adc 引脚的值。这个值对创造波不重要吗?

0 投票
1 回答
1553 浏览

arduino - Arduino UNO ADC's ADCH returns a constant value in free running mode

I've stripped everything that I'm sure is not relevant out of my code below. Basically we're inputting a signal through pin A0 and sending samples over serial. It's a relatively simple project but because we want to maximize speed we're trying to avoid using analogRead(). However instead of getting a curve back we get a flatline that doesn't respond to any input, only to the prescaler values.

I've verified all of the register changes and they are all set correctly. If we run the system with the analogRead() code then it works so I know the circuit is working. I can not find any clear information around about why this might be happening. I've played around with the ADMUX channel select to see if maybe I was on the wrong channel but I'm not. Overall I'm very confused by this right now!