Как использовать и настроить АЦП STM32F407G-Discovery в nanoFramework?

Добрый день.
Объект: STM32F407G-Discovery + ChibiOS + nanoFramework, подключены только USB-разъёмы.
Пытаюсь использовать преднастроенные каналы АЦП. Вот они по документации:

- PC1, ADC1 IN11
- PC2 ADC1 IN12
- PA6 ADC2 IN6
- PA7 ADC2 IN7
- PB0 ADC2 IN8
- Temp Sensor ADC1
- VrefInt ADC1
- Vbatt ADC1


Тогда пишу код
using System;
using System.Diagnostics;
using System.Threading;
using System.Device.Adc;

namespace ADCMeasure
{
    public class Program
    {
        private static int adcValue;

        public static void Main()
        {
            AdcController adcController = new AdcController();
            AdcChannel pa6Channel = adcController.OpenChannel(6);

            while (true)
            {
                adcValue = pa6Channel.ReadValue();
                double ratio = pa6Channel.ReadRatio();
                Debug.WriteLine($"{nameof(adcValue)}: {adcValue}; {nameof(ratio)}: {ratio}; MaxValue: {adcController.MaxValue}; MinValue: {adcController.MinValue}");
                Thread.Sleep( 1000 );
            }
        }
    }
}

Тем временем в отладочной консоли
adcValue: 1695; ratio: 0.41343101; MaxValue: 4095; MinValue: 0

что соответствует реальным 2,7 В на PA6.

Пробую повторить с 7 каналом

...
AdcChannel pa6Channel = adcController.OpenChannel(7);
...

В отладочной консоли
adcValue: 4; ratio: 0; MaxValue: 4095; MinValue: 0

что соответствует реальным 0 В на PA7.
При подаче внешнего напряжения в 2 В на PA7 в консоли ничего не меняется. В реальном мире на PA7 напряжение 2 В.

Подскажите, пожалуйста, что я делаю не так? Можно ли как-то настроить конкретные выводы под АЦП прямо в коде?

На всякий случай - настроенные АЦП из исходного кода сборки ChibiOS:
target_system_device_adc_config.cpp
#include <sys_dev_adc_native_target.h>

const NF_PAL_ADC_PORT_PIN_CHANNEL AdcPortPinConfig[] = {

    // ADC1
    {1, GPIOC, 1, ADC_CHANNEL_IN11},
    {1, GPIOC, 2, ADC_CHANNEL_IN12},

    // ADC2
    {2, GPIOA, 6, ADC_CHANNEL_IN6},
    {2, GPIOA, 7, ADC_CHANNEL_IN7},
    {2, GPIOB, 0, ADC_CHANNEL_IN8},

    // these are the internal sources, available only at ADC1
    {1, NULL, 0, ADC_CHANNEL_SENSOR},
    {1, NULL, 0, ADC_CHANNEL_VREFINT},
    {1, NULL, 0, ADC_CHANNEL_VBAT},
};

const int AdcChannelCount = ARRAYSIZE(AdcPortPinConfig);
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
Jalui
@Jalui Автор вопроса
Индекс, который используется при вызове метода adcController.OpenChannel(6), является индексом массива AdcPortPinConfig[] (тот, что в файле target_system_device_adc_config.cpp). Таким образом, 6 соответствует Vref, а 7 - Vbat (первый индекс - 0).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@guoxinsichen
АЦП SC1644 (совместимый с AD7173) Пожалуйста, не стесняйтесь обращаться к нам по адресу jesse540575953@gmail.com.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы