标签: adc

从覆盆子pi上的ADC芯片读取原始音频值

我将MCP3008 ADC芯片连接到驻极体麦克风和我的pi.我在python中使用bit-banging读取输入,我得到一个0-1024的整数.

我按照本教程进行了比特操作:https://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi/connecting-the-cobbler -to-A-mcp3008

我的问题是如何取这个整数并将其转换为有意义的东西?我可以以某种方式将这些字节写入python中的文件,以获取Audacity可以播放的原始音频数据吗?现在,当我尝试写入值时,它们只显示为整数而不是二进制.我是python的新手,我发现这个链接用于转换原始数据,但是我在生成原始数据时遇到了麻烦:Python打开原始音频数据文件

我甚至不确定这些值代表什么,他们是PCM数据,我必须做与时间有关的数学?

python audio adc raspberry-pi

5
推荐指数
1
解决办法
2543
查看次数

ADC 仅在 ATMEGA324PA 上工作一次

我有一些代码应该每次在换向器环路周围读取几个 ADC 引脚的值。

static uint16_t adc0;
static uint16_t adc1;

void init(void) {
    ...
    hw_configure_adcs();
    ...
}

void loop(void) {
    ...
    adc0 = hw_read_adc(0);
    adc1 = hw_read_adc(1);
    ...
}

void hw_configure_adcs(void) {
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);
}

uint16_t hw_read_adc(uint8_t n) {
    ADMUX = (1<<REFS0) | (n & 0x07);
    ADCSRA |= (1<<ADSC); // start conversion
    uint16_t count;
    for (count = 0; !(ADCSRA & (1<<ADIF)); count++); // wait for conversion to complete
    // ADCSRA |= (1<<ADIF); // tried with and …
Run Code Online (Sandbox Code Playgroud)

c avr atmega adc

5
推荐指数
1
解决办法
1124
查看次数

校准 STM32 ADC (VREFINT)

我正在尝试在 STM32F042 微控制器上读取 VDDA。我在 VDD 为 3.29V 时得到了意想不到的结果。我一定缺少一些基本的东西。

输出:

VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1885; VREFINT_CAL=1524; VDDA=2668 mV
VREFINT=1913; VREFINT_CAL=1524; VDDA=2628 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
Run Code Online (Sandbox Code Playgroud)

adc_test.c:

VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1885; VREFINT_CAL=1524; VDDA=2668 mV
VREFINT=1913; VREFINT_CAL=1524; VDDA=2628 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
Run Code Online (Sandbox Code Playgroud)

数据表截图:

在此处输入图片说明

参考手册截图

请注意,这是指 .3V,但我认为这是一个错字,因为上面的数据表和下面更长的公式是指 3.3V,而 .3V 低于该部件的最低工作电压

在此处输入图片说明

stm32 adc stm32f0

5
推荐指数
1
解决办法
8698
查看次数

如何使用PyQt中的按钮在while循环中退出程序

我有以下代码,这些代码将在PyQt中单击“开始”按钮后启动:

def Start(self):
  import time
  import os
  import RPi.GPIO as GPIO
  import datetime

  GPIO.setmode(GPIO.BCM)
  DEBUG = 1

  os.system('clear')

  # SPI port on GPIO
  SPICLK = 18
  SPIMISO = 23
  SPICS = 25

  # set up the SPI interface pins
  GPIO.setup(SPIMISO, GPIO.IN)
  GPIO.setup(SPICLK, GPIO.OUT)
  GPIO.setup(SPICS, GPIO.OUT)

  GPIO.output(SPICS, True)
  GPIO.output(SPICS, False) # bring CS low
  while True:
        adcout = 0             
        read_adc = 0
        #s=time.clock()
        for i in range(25):
            GPIO.output(SPICLK, True)
            GPIO.output(SPICLK, False)
            adcout <<= 1
            if (GPIO.input(SPIMISO)==1):
                adcout |= 0x1
        time.sleep(0.085)   
        if …
Run Code Online (Sandbox Code Playgroud)

python pyqt adc

4
推荐指数
1
解决办法
4101
查看次数

STM32上的ADC单次转换

我正在研究STM32 F103x上的ADC编程,从最简单的情况开始 - 单次转换.测量内部温度传感器(连接到ADC1)的值,并使用USART将其发送到COM端口.目标似乎很清楚但是当我尝试将源代码下载到闪存时,它不会向COM端口发送任何数据.USART功能运行良好,我猜这些问题来自ADC配置部分,因为我正处于等待完全转换的循环中:

while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //Wail for conversion complete
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的源代码.

/* Includes ------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>

    uint16_t AD_value;
    const uint16_t V25 = 1750; //when V25=1.41V
    const uint16_t Avg_Slope = 5; //when avg_slc
    uint16_t TemperatureC;

//Define output device
PUTCHAR_PROTOTYPE
{
    USART_SendData(USART1, (uint8_t) ch);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}
    return ch;
}

void Usart1Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    /* COnfig PA9 for USART Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin …
Run Code Online (Sandbox Code Playgroud)

c serial-port stm32 adc usart

4
推荐指数
2
解决办法
2万
查看次数

装配ADC(附带进位)

mov eax, ptr_to_num1 ; little endian
mov ebx, ptr_to_num2 ; little endian
xor ecx, ecx
xor edx, edx
clc
bytes_addition:
    mov dl, byte [eax+ecx] ; byte from shortest
    adc dl, byte [ebx+ecx]
    mov byte [eax+ecx], dl
    inc ecx
    cmp ecx, 4 ; counter, 
    jl bytes_addition
Run Code Online (Sandbox Code Playgroud)

考虑一下

EAX:4F2252FF(大端)

EBX:00DFFC00(大端)

这个添加的结果是错误的:50024fff(大端).它应该是50024eff.看起来进位标志受到影响,但为什么呢?

assembly adc

4
推荐指数
1
解决办法
644
查看次数

GBZ80 - ADC 指令测试失败

我一直在通过我的 Gameboy 模拟器运行Blaargs CPU 测试,并且op r,r测试显示我的 ADC 指令无法正常工作,但 ADD 可以正常工作。我的理解是,两者之间的唯一区别是在加法之前将现有的进位标志添加到第二个操作数。因此,我的 ADC 代码如下:

void Emu::add8To8Carry(BYTE &a, BYTE b) //4 cycles - 1 byte
{
    if((Flags >> FLAG_CARRY) & 1)
        b++;
    FLAGCLEAR_N;
    halfCarryAdd8_8(a, b); //generates H flag based on addition
    carryAdd8_8(a, b); //generates C flag appropriately
    a+=b;
    if(a == 0)
        FLAGSET_Z;
    else
        FLAGCLEAR_Z;
}
Run Code Online (Sandbox Code Playgroud)

我将以下内容输入到测试 ROM 中:

06 FE 3E 01 88
Run Code Online (Sandbox Code Playgroud)

当进位标志被设置时,A 的值为0 (Flags = B0),当进位标志未设置时,A 的值为FF (Flags = 00)。据我的理解,这应该是这样的。然而,它仍然未能通过测试。

根据我的研究,我相信标志受到与 ADD 相同的影响。从字面上看,我的代码与工作 ADD …

z80 emulation adc gameboy

4
推荐指数
1
解决办法
1986
查看次数

STM32 ADC连续转换模式不会自动启动转换

我试图在简单的连续转换模式下通过STM32F411RE配置ADC.我使用CubeMX生成基于HAL驱动程序的代码,这是初始化ADC的生成代码的一些部分:

/* ADC1 init function */
void MX_ADC1_Init(void)
{

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
  hadc1.Init.Resolution = ADC_RESOLUTION_8B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

}
Run Code Online (Sandbox Code Playgroud)

这是主要功能:

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* …
Run Code Online (Sandbox Code Playgroud)

microcontroller gcc arm stm32 adc

4
推荐指数
1
解决办法
5441
查看次数

如何将读取 ADC 值转换为浮点数?

我想将 ADC 值转换为浮点数。这是我的代码:

uint32_t ADCValue;
char str[15];

          ADCValue = HAL_ADC_GetValue(&hadc1);
          ADCValue=ADCValue*3.3/4095;
          sprintf(str, "%d", Voltage);
          HAL_UART_Transmit(&huart2, (uint8_t*)(&str), 6, 100);
          HAL_UART_Transmit(&huart2, (uint8_t*) "\n\r", 2, 100);
          HAL_Delay(500);
Run Code Online (Sandbox Code Playgroud)

我在 3.3V 下读取 4095 的值,但我正在将 3 传输到缓冲区。我想传输电压的确切值。

c data-conversion stm32 adc

3
推荐指数
2
解决办法
5029
查看次数

使 stm32 ADC DMA 工作缺少什么?不发生转会竞争

我正在使用 stm32f3 发现板和来自 CubeMX 的 HAL。我正在尝试在 ADC4 上使用 2 个 ADC 通道。我在循环模式下配置了 DMA。在 main 中的主循环之前,我调用:

HAL_ADC_Start_DMA(&hadc4, DMA_adc4_buffer, 16);
Run Code Online (Sandbox Code Playgroud)

我实现了功能HAL_ADC_ConvHalfCpltCallbackHAL_ADC_ConvCpltCallback. 现在奇怪的部分HAL_ADC_ConvHalfCpltCallback是:定期调用,HAL_ADC_ConvCpltCallback不是。

它告诉我,带有 DMA 传输的 ADC 运行良好。但是为什么不调用传输竞争回调?如果我用HAL_ADC_Start_IT中断函数启动ADC ,但那不是我想要的。

HAL_DMA_IRQHandler在 ST HAL 中放置断点也表明回调从未被调用。

为了完整起见,这里部分 ADC4_Init 函数:

/**Common config 
*/
hadc4.Instance = ADC4;
hadc4.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc4.Init.Resolution = ADC_RESOLUTION_12B;
hadc4.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc4.Init.ContinuousConvMode = ENABLE;
hadc4.Init.DiscontinuousConvMode = DISABLE;
hadc4.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc4.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc4.Init.NbrOfConversion = 2;
hadc4.Init.DMAContinuousRequests = ENABLE; …
Run Code Online (Sandbox Code Playgroud)

stm32 dma adc

3
推荐指数
1
解决办法
1万
查看次数