[решено] STM32 Nucleo F401RE: AnalogIn не правильно работает?

Тема в разделе "Arduino & Shields", создана пользователем altex, 28 сен 2014.

  1. altex

    altex Гик

    Я не нашёл форума, посвящённого другим отладочным платам, продающимся в Амперке, поэтому пишу сюда.

    Недавно стал счастливым обладателем STM32 Nucleo F401RE (http://amperka.ru/product/stm32-nucleo-f401re) после того как посмотрел видео из блога Амперки. По описанию платформа понравилась, и я решил для целей обучения программированию на ней выполнить те 20 мини-проектов и экспериментов из вики (http://wiki.amperka.ru/мини-проекты-arduino-breadboard:оглавление). Все комплектующие у меня есть, из набора Матрёшки Z.

    Так вот, дошёл до 3 эксперимента, чтение аналогового сигнала.
    Написал вот такой скетч, чтобы продемонстрировать проблему, которую обнаружил.
    Подключил два аналоговых входа - один к +5В, другой к GND.
    Ожидал там увидеть 1.0 и 0.0 сответственно.
    Но вместо этого вижу на входе от GND значения близкие к нулю, но не ноль, например "0.000733"
    А на входе, подключенному к +5V вижу "0.757265", что вообще очень далеко от ожидаемой там "1.0".

    И что ещё более запутывает, что если подключить к аналоговому входу переменный резистор 10К, которые с двух концов подключить к +5V и GND, и переменным контактом в аналоговый вход, чтобы считать значения (точь-в-точь как в эксперименте 3 - http://wiki.amperka.ru/конспект-arduino:светильник-с-управляемой-яркостью) то значения меняются от 0.000733 до 0.757265 (хотя ожидается что от 0.0 до 1.0), но при этом не линейно, как может показаться, а проходя значение 1.000000 где-то близко к краю, к которому подключено +5V. Тоесть если крутить переменный резистор от крайнего положения по часовой стрелке, то значения на аналоговом входе меняются от 0.000733 до 1.000000 плавно, а дальше так же плавно продолжают меняться от 1.000000 до 0.757265!

    Может кто-нибудь помочь понять, что я делаю не так?

    Сам скетч

    Код (Text):

    #include "mbed.h"

    #define POT1_PIN     PA_0
    #define POT2_PIN     PA_1
    #define POT3_PIN     PA_4

    AnalogIn analog_value1(POT1_PIN);
    AnalogIn analog_value2(POT2_PIN);
    AnalogIn analog_value3(POT3_PIN);

    int main() {
        while(1) {
            uint16_t pot = analog_value3.read_u16();

            printf("Vin=%f GND=%f POT=%f POT_u16=%x\n",
                (float)analog_value1,
                (float)analog_value2,
                (float)analog_value3,
                pot
            );
            wait(0.25);
        }
    }

     
    Отладочный вывод в последовательный порт выглядит так:

    Код (Text):
    // поворачиваю ручку потенциометра строго в одну сторону
    Vin=0.755800 GND=0.000488 POT=0.000488 POT_u16=60
    Vin=0.756044 GND=0.000244 POT=0.000000 POT_u16=50
    Vin=0.755800 GND=0.000977 POT=0.000244 POT_u16=30
    Vin=0.755556 GND=0.000488 POT=0.001465 POT_u16=10
    Vin=0.755800 GND=0.000977 POT=0.000977 POT_u16=0
    Vin=0.756532 GND=0.000977 POT=0.000977 POT_u16=40
    Vin=0.755556 GND=0.000488 POT=0.000000 POT_u16=20
    Vin=0.755800 GND=0.000977 POT=0.000244 POT_u16=50
    Vin=0.756044 GND=0.000488 POT=0.000977 POT_u16=70
    Vin=0.756288 GND=0.000000 POT=0.000733 POT_u16=0
    Vin=0.756044 GND=0.000000 POT=0.044200 POT_u16=b80
    Vin=0.755556 GND=0.000488 POT=0.093284 POT_u16=1981
    Vin=0.755556 GND=0.000977 POT=0.125275 POT_u16=2052
    Vin=0.756044 GND=0.000000 POT=0.162149 POT_u16=2942
    Vin=0.755800 GND=0.001954 POT=0.184127 POT_u16=2ea2
    Vin=0.755800 GND=0.000488 POT=0.232479 POT_u16=3b93
    Vin=0.755556 GND=0.000977 POT=0.266667 POT_u16=44a4
    Vin=0.755556 GND=0.000733 POT=0.318681 POT_u16=51b5
    Vin=0.755800 GND=0.001221 POT=0.357998 POT_u16=5b85
    Vin=0.755556 GND=0.000977 POT=0.393407 POT_u16=6506
    Vin=0.756044 GND=0.000977 POT=0.440293 POT_u16=7097
    Vin=0.755556 GND=0.001954 POT=0.474970 POT_u16=79f7
    Vin=0.755800 GND=0.000733 POT=0.523077 POT_u16=8558
    Vin=0.756044 GND=0.000000 POT=0.552625 POT_u16=8d48
    Vin=0.756532 GND=0.000000 POT=0.591453 POT_u16=9849
    Vin=0.755067 GND=0.001709 POT=0.639316 POT_u16=a4ba
    Vin=0.755800 GND=0.000488 POT=0.676679 POT_u16=adaa
    Vin=0.755800 GND=0.000977 POT=0.716239 POT_u16=b75b
    Vin=0.756044 GND=0.000000 POT=0.742125 POT_u16=bdeb
    Vin=0.756044 GND=0.000000 POT=0.773626 POT_u16=c63c
    Vin=0.756044 GND=0.000733 POT=0.802686 POT_u16=ccfc
    Vin=0.756044 GND=0.000977 POT=0.826618 POT_u16=d39d
    Vin=0.755800 GND=0.000977 POT=0.853236 POT_u16=da5d
    Vin=0.755556 GND=0.000977 POT=0.862271 POT_u16=dcbd
    Vin=0.756288 GND=0.000000 POT=0.863004 POT_u16=dcdd
    Vin=0.755556 GND=0.000244 POT=0.861783 POT_u16=dc7d
    Vin=0.755311 GND=0.001221 POT=0.863004 POT_u16=dcfd
    Vin=0.756288 GND=0.000000 POT=0.904518 POT_u16=e7de
    Vin=0.756288 GND=0.000000 POT=0.927228 POT_u16=ee4e
    Vin=0.756044 GND=0.001465 POT=0.958730 POT_u16=f54f
    Vin=0.756044 GND=0.001221 POT=0.994139 POT_u16=fdff
    Vin=0.755800 GND=0.000733 POT=1.000000 POT_u16=ffff
    Vin=0.755556 GND=0.000977 POT=1.000000 POT_u16=ffff
    Vin=0.755800 GND=0.000733 POT=1.000000 POT_u16=ffff
    Vin=0.756288 GND=0.000000 POT=1.000000 POT_u16=ffff
    Vin=0.755800 GND=0.000244 POT=1.000000 POT_u16=ffff
    Vin=0.755800 GND=0.000733 POT=1.000000 POT_u16=ffff
    Vin=0.756044 GND=0.001221 POT=1.000000 POT_u16=ffff
    Vin=0.755556 GND=0.000244 POT=1.000000 POT_u16=ffff
    Vin=0.756044 GND=0.000733 POT=1.000000 POT_u16=ffff
    Vin=0.755800 GND=0.001221 POT=1.000000 POT_u16=ffff
    // продолжаю поворачивать ручку потенциометра строго в одну сторону, ещё не достиг края
    Vin=0.755556 GND=0.000977 POT=0.839805 POT_u16=ffff
    Vin=0.756044 GND=0.001221 POT=0.753846 POT_u16=ffff
    Vin=0.756288 GND=0.000000 POT=0.834921 POT_u16=c14c
    Vin=0.756044 GND=0.000733 POT=0.751893 POT_u16=c0dc
    Vin=0.756288 GND=0.000000 POT=0.752869 POT_u16=c0fc
    Vin=0.755800 GND=0.000733 POT=0.752869 POT_u16=c11c
    Vin=0.756532 GND=0.000488 POT=0.752869 POT_u16=c12c
    Vin=0.755800 GND=0.000977 POT=0.752869 POT_u16=c14c
    Vin=0.756532 GND=0.000000 POT=0.752869 POT_u16=c11c
    Vin=0.755800 GND=0.000244 POT=0.752869 POT_u16=c11c
    Vin=0.755556 GND=0.000977 POT=0.752869 POT_u16=c11c
    Vin=0.755067 GND=0.000000 POT=0.752869 POT_u16=c11c
    Vin=0.755800 GND=0.000488 POT=0.753114 POT_u16=c16c
    Vin=0.755800 GND=0.000977 POT=0.752869 POT_u16=c12c
    Vin=0.755800 GND=0.000488 POT=0.753114 POT_u16=c11c
    Vin=0.755556 GND=0.000977 POT=0.752869 POT_u16=c11c
    Vin=0.755800 GND=0.000488 POT=0.753114 POT_u16=c11c
    Vin=0.756044 GND=0.000000 POT=0.752869 POT_u16=c12c
    Vin=0.755800 GND=0.000244 POT=0.753114 POT_u16=c11c
    Vin=0.755556 GND=0.001465 POT=0.753114 POT_u16=c12c
    Vin=0.755556 GND=0.000733 POT=0.752869 POT_u16=c11c
    Vin=0.755800 GND=0.001221 POT=0.753114 POT_u16=c14c
    Vin=0.756044 GND=0.000488 POT=0.753114 POT_u16=c11c
     
    Последнее редактирование: 28 сен 2014
  2. altex

    altex Гик

    Оказывается референсное значение напряжения = 3.3В
    https://mbed.org/users/yoonghm/notebook/analog-input/
    Соответственно если подключить выход 3V3 вместо 5V к потенциометру или к аналоговому входу, то успешно считывается нужное значение:

     
    nailxx и acos нравится это.