标签: adc

使用 STM32F0 ADC 单独读取不同的输入

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)

c microcontroller stm32 adc stm32f0

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

模拟输入引脚PA8,PA11和PA12在STM32F103RB上不工作

处理一个简单的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)

c embedded stm32 adc

2
推荐指数
1
解决办法
2255
查看次数

比格犬骨 ADC 读取值

我正在尝试使用每 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)

c adc beagleboneblack

2
推荐指数
1
解决办法
5162
查看次数

增加Beaglebone Black ADC采样率?

我正在开发一个需要使用微控制器的项目,因此我决定使用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能够做到这一点,但我找不到明确的方法.任何帮助表示赞赏.提前致谢.

sampling adc cloud9-ide beagleboneblack

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

如何解决错误消息“ __builtin_avr_delay_cycles期望编译时整数常量使”?

我的程序未使用GCC AVR编译器进行编译。这是在微处理器和LCD屏幕上的小型游戏。

move_delay = 200;
_delay_ms( move_delay );
Run Code Online (Sandbox Code Playgroud)

它不喜欢_delay_ms是变量,但是它必须是变量,因为我可以通过ADC调整屏幕动作。有没有办法使它保持恒定,但仍可与ADC一起使用?

c adc

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

stm32f103 ADC 采样率

我在这里设置了 adc 采样时间周期:

ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_71Cycles5);
Run Code Online (Sandbox Code Playgroud)

如何从stm32f103中计算ADC的采样率?

stm32 adc

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

HAL_ADC_PollForConversion - 它到底是做什么用的?

我已经对 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)

stm32 adc nucleo stm32cubeide

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