STM32F072CBU 微控制器。
我有多个 ADC 输入,希望单独读取它们。STMcubeMX 生成样板代码,假设我希望按顺序读取所有输入,但我无法弄清楚如何纠正这个问题。
这篇博文表达了我遇到的同样的问题,但给出的解决方案似乎不起作用。每次转换时打开和关闭 ADC 与返回值中的错误相关。仅当我在 STMcubeMX 中配置单个 ADC 输入,然后在不取消初始化 ADC 的情况下进行轮询时,才会返回准确的读数。
cubeMX的adc_init函数:
/* ADC init function */
static void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; …Run Code Online (Sandbox Code Playgroud) 处理一个简单的ADC项目,从多个通道上的分压器读取电压.我在商用和制作精良的PCB上使用STM32f103rb.我正在读PORTA上的引脚,以下引脚工作并返回电压:
PA0,PA1,PA4,PA5,PA6,PA7.
但是,以下引脚不起作用并返回大约2000-2700的原始值:
PA8,PA11和PA12.
该项目的性质以及PCB具有固定设计的事实意味着我们坚持使用这些引脚选择.数据表非常具体,可以将这些引脚用作AIN.所有设置和配置均按照标准STM32进行,取自基本示例代码并根据我们的目的进行修改.包含的代码是我们制作的调试版本,试图找到原因但无济于事.
已经测量了引脚上的电压,并且对于分压器的类型是正确的.
任何帮助将不胜感激.
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stdio.h"
#include "stdlib.h"
// Standard STM peripheral config functions
void RCC_Configuration(void);
void GPIO_Configuration(void);
// ADC config - STM example code
void NEW_ADC_Configuration(void);
// Function to read ADC channel and output value
u16 NEW_readADC1(u8 channel);
// Variables
double voltage_su; // Variable to store supply voltage
double voltage7;
double voltage8;
//*****************************************************************************
// Main program
int main(void)
{
// Initialise peripheral modules
RCC_Configuration();
GPIO_Configuration();
NEW_ADC_Configuration();
// Infinate loop
while (1) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用每 10 秒一次的周期性任务读取 ADC 引脚 ADC0 到 ADC5。为此,我使用 read() 读取 4 个字节。读取的值可以在 0 - 4095(理论上)之间变化。然而,我似乎并不是每次都能得到准确的读数。此外,当我在 adc_read() 函数中评论这个 [printf ("value of pin ADC%d =%.4s \n", pin, val);] 行时,我得到的值不正确,通常以所有引脚显示相同的值。
这是正确的方法吗?
注意:我在 gcc 中使用 -O0 开关以避免优化问题。
谢谢。
这是我正在使用的读取功能---->
int adc_read(unsigned int pin)
{
int fd, len, j;
char buf[MAX_BUF];
char val[3];
len = snprintf(buf, sizeof(buf), "/sys/devices/ocp.2/helper.9/AIN%d", pin);
fd = open(buf, O_RDONLY);
if (fd < 0) {
perror("adc/get-value");
}
read(fd, &val, 4);
close(fd);
}
printf ("value of pin ADC%d =%.4s \n", pin, val);
return …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要使用微控制器的项目,因此我决定使用Beaglebone Black.我还是Beaglebone世界的新手,我面临一些问题,希望你们能帮助我.
在我的项目中,我将不得不连续读取所有7个模拟读取引脚并进行相应的处理.我的问题是,最快的编程语言是什么(我必须在很短的时间内尽可能多地读取样本!)以及如何将采样率从KHz提高到MHz?
我尝试了以下代码:
Javascript代码:
var b = require('bonescript');//this variable is to refer to my beaglebone
time = new Date();
b.analogRead("P9_39");
console.log(new Date() - time);
Run Code Online (Sandbox Code Playgroud)
此代码将只执行一次模拟读取,并将打印出执行读取所需的时间.令人惊讶的是,结果是111ms !! 这意味着如果我没错,我的采样率是10.
另一种方法是使用pyhton:
import Adafruit_BBIO.ADC as ADC
import time
ADC.setup()
millis = int(round(time.time() * 1000))
ADC.read_raw("P9_39")
millis = millis = int(round(time.time() * 1000)) - millis
print millis
Run Code Online (Sandbox Code Playgroud)
这段代码花费的时间较少(4ms)但是,如果我想从7个模拟输入引脚读取,我将只能读取每个35个样本.
使用终端:
echo cape-bone-iio > /sys/devices/bone_capemgr.*/slots
time cat /sys/devices/ocp.3/helper.15/AIN0
############OR############
time cat /sys/devices/ocp.3/44e0d000.tscadc/tiadc/iio\:device0/in_voltage0_raw
Run Code Online (Sandbox Code Playgroud)
这耗时50ms.
我希望我的采样率是MHz.我怎么能这样做?我知道Beaglebone Black能够做到这一点,但我找不到明确的方法.任何帮助表示赞赏.提前致谢.
我的程序未使用GCC AVR编译器进行编译。这是在微处理器和LCD屏幕上的小型游戏。
move_delay = 200;
_delay_ms( move_delay );
Run Code Online (Sandbox Code Playgroud)
它不喜欢_delay_ms是变量,但是它必须是变量,因为我可以通过ADC调整屏幕动作。有没有办法使它保持恒定,但仍可与ADC一起使用?
我在这里设置了 adc 采样时间周期:
ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_71Cycles5);
Run Code Online (Sandbox Code Playgroud)
如何从stm32f103中计算ADC的采样率?
我已经对 STM32 (F103RB) 进行了几周的修修补补,但我不明白的一件事是
HAL_ADC_PollForConversion
Run Code Online (Sandbox Code Playgroud)
功能目的。我的意思是,我没有看到此功能对 ADC 读数有任何影响。这是我的代码示例:
Version 1 (with PollForConversion on)
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t value = HAL_ADC_GetValue(&hadc1);
float voltage = 3.3f * value / 4096.0f;
printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART
HAL_Delay(250);
}
Version 2 (with PollForConvertion off)
while (1)
{
HAL_ADC_Start(&hadc1);
//HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t value = HAL_ADC_GetValue(&hadc1);
float voltage = 3.3f * value / 4096.0f;
printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART …Run Code Online (Sandbox Code Playgroud) adc ×7
c ×4
stm32 ×4
cloud9-ide ×1
embedded ×1
nucleo ×1
sampling ×1
stm32cubeide ×1
stm32f0 ×1