我将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数据,我必须做与时间有关的数学?
我有一些代码应该每次在换向器环路周围读取几个 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) 我正在尝试在 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)
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)
我有以下代码,这些代码将在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) 我正在研究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) 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.看起来进位标志受到影响,但为什么呢?
我一直在通过我的 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 …
我试图在简单的连续转换模式下通过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) 我想将 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 传输到缓冲区。我想传输电压的确切值。
我正在使用 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_ConvHalfCpltCallback和HAL_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)