Перейти к содержанию
    

Добрый день. 

Пытаюсь запустить АЦП у Artery. Возникает ситуация для меня непонятная. Вывод PIN_POWER_SENSOR1 подключен к контроллеру, за 1(или 2, результат не меняет) мс до измерения я подаю туда 1. Вывод SENSOR_1 идет на клемму подключения внешнего измеряемого сопротивления, PIN_SENSOR_1 идет ко входу АЦП МК. R16 ограничивает ток, R17 вместе с измеряемым внешним сопротивлением образуют делитель на землю.

Происходит странное для меня. Пробовал уже заменять номиналы r16-r17 на 4k7, вне зависимости от этого при подключении к SENSOR_1 резистора 1К на землю напряжение на резисторе R16 составляет 0.75В!!! Те на SENSOR_1 0.25В, на PIN_SENSOR_1 1В((

Те получается входной ток ВЫТЕКАЮЩИЙ из пина МК АЦП 159мкА.

Ну и намеряется в итоге 1В. Обьясните, что я делаю не так ?

Измерять напряжение на R16 пытался как на ходу, когда непрерывно идут измерения, так и при останове процессора в брекпойнт, когда измерений нету. Смотрю все осциллографом, прибавка напряжения постоянная, как будто в пине АЦП подтяжка включена. Но подтяжки там не может быть((

 

tmp.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/16/2023 at 6:17 PM, 1113 said:

убедитесь что внутри вывода не включены подтяжки и тп резисторы

там штатный конфиг из appnote adc.

В аналоговом режиме подтяжка отключается сама.

такто единственное разумное что в голову приходит.

 

Но нет. Сейчас подал 0 на PIN_POWER_SENSOR1 и встал в брекпойнт, на PIN_SENSOR_1 вместо 1В стал круглый 0((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

АЦП опрашивает только один канал? У Артери каналы неплохо так влияют друг на друге при последовательном опросе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/17/2023 at 8:16 AM, tren359 said:

АЦП опрашивает только один канал? У Артери каналы неплохо так влияют друг на друге при последовательном опросе

да там выборка серии, 12 каналов за раз.

И скорость не самая низкая, правда в настройках всех каналов стоит ADC_SAMPLETIME_239_5

пробовал менять частоту АЦП в 8 раз. Не вижу разницы 

 

Причем я же писал, могу остановить в breakpoint программу, АЦП остановится - он с программным запуском. И все равно на входе АЦП будет 1В, когда на делителе 0.25, если на PIN_POWER_SENSOR1 единичка (те 3.3)(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я сталкивался с тем, что, если канал, на котором точно ноль, обрабатывается после канала, на котором единица, то АЦП выдаст ненулевое значение на высоких частотах обработки. (не важно, ставить breakpoint или нет). Также сталкивался с тем, что не всегда гененрируется прерывание по окончанию последовательного преобразования - использовал DMA и в результате все значения смещались. AT32F413RCT7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас высокое выходное сопротивление делителя. Оно вместе с входной ёмкостью АЦП составляет задержку.

Необходимо выбрать Sample time чтоб входная ёмкость успевала перезарядиться. Посмотри в DataSheet.

Например для AT32F407 это 10пФ. То есть нужно подождать 1мкс.

 

Если подключить осциллограф непосредственно на ножку, то будет виден небольшой пичёк напряжения, вызванный перезарядкой этой ёмкости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/17/2023 at 10:56 AM, dOb said:

У вас высокое выходное сопротивление делителя. Оно вместе с входной ёмкостью АЦП составляет задержку.

Я же писал, что мне этот номинал тоже не нравится я его менял на 4k7. Без изменений.

 

On 10/17/2023 at 10:56 AM, dOb said:

Необходимо выбрать Sample time чтоб входная ёмкость успевала перезарядиться. Посмотри в DataSheet.

ADC_SAMPLETIME_239_5 это предельная длительность выборки

 

On 10/17/2023 at 10:56 AM, dOb said:

Например для AT32F407 это 10пФ. То есть нужно подождать 1мкс.

Если подключить осциллограф непосредственно на ножку, то будет виден небольшой пичёк напряжения, вызванный перезарядкой этой ёмкости.

Пички видны но они ничтожны по сравнению с 0.75В постоянного смещения

 

On 10/17/2023 at 10:54 AM, tren359 said:

Я сталкивался с тем, что, если канал, на котором точно ноль, обрабатывается после канала, на котором единица, то АЦП выдаст ненулевое значение на высоких частотах обработки. (не важно, ставить breakpoint или нет). Также сталкивался с тем, что не всегда гененрируется прерывание по окончанию последовательного преобразования - использовал DMA и в результате все значения смещались. AT32F413RCT7

Прерывание в режиме ADC12_ORDINARY_TRIG_SOFTWARE на выборку серии каналов не генерируется вовсе - это у артери фича а не баг, прерывание о завершении выборки я получаю по завершению транзакции DMA, что забирает данные. У меня 403a но кажется все к одному.

 

Понять бы откуда берутся эти 0.75В постоянного смещения, и вопрос был бы исчерпан

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/17/2023 at 11:07 AM, 1113 said:

на другом экземпляре то же самое?

Да два экземпляра. В одном стоят 20к резисторы, во втором заменены все на 4k7. Щаз перемерил опять в 20-й уже раз - читаю сам посты в чате, глазам не верю.

Но смещение есть и оно постоянное, как будто в пине пуллап(((

 

Вот код инициализации АЦП:

adc_base_config_type adc_base_struct;
  crm_adc_clock_div_set(CRM_ADC_DIV_16);
  crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  //nvic_irq_enable(ADC1_2_IRQn, 0, 0);
  /* select combine mode */
  adc_combine_mode_select(ADC_INDEPENDENT_MODE);
  adc_base_default_para_init(&adc_base_struct);
  adc_base_struct.sequence_mode = TRUE;
  adc_base_struct.repeat_mode   = FALSE;
  adc_base_struct.data_align    = ADC_RIGHT_ALIGNMENT;
  adc_base_struct.ordinary_channel_length = cNumAdcChs;
  adc_base_config(ADC1, &adc_base_struct);
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1,  1, ADC_SAMPLETIME_239_5);//PinBatVolt|PA1
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_2,  2, ADC_SAMPLETIME_239_5);//PinSourceVolt|PA2
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_10, 3, ADC_SAMPLETIME_239_5);//PinMeter1|PC0
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_11, 4, ADC_SAMPLETIME_239_5);//PinMeter2|PC1
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_12, 5, ADC_SAMPLETIME_239_5);//PinMeter3|PC2
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_13, 6, ADC_SAMPLETIME_239_5);//PinMeter4|PC3
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_8,  7, ADC_SAMPLETIME_239_5);//PinSensor1|PB0
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_15, 8, ADC_SAMPLETIME_239_5);//PinSensor2|PC5
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_14, 9, ADC_SAMPLETIME_239_5);//PinSensor3|PC4
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_7, 10, ADC_SAMPLETIME_239_5);//PinSensor4|PA7
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_5, 11, ADC_SAMPLETIME_239_5);//PinSensor5|PA5
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_4, 12, ADC_SAMPLETIME_239_5);//PinSensor6|PA4
  adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
  //adc_interrupt_enable(ADC1, ADC_CCE_INT, TRUE);
  adc_enable(ADC1, TRUE);
  adc_calibration_init(ADC1);
  while (adc_calibration_init_status_get(ADC1));
  adc_calibration_start(ADC1);
  while (adc_calibration_status_get(ADC1));
  adc_dma_mode_enable(ADC1, TRUE);

 

 

Вот инициализация пинов:

void gpio_config(void){
  gpio_init_type gpio_initstruct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE); 
  
  gpio_default_para_init(&gpio_initstruct);
  gpio_initstruct.gpio_mode          = GPIO_MODE_MUX;
  gpio_initstruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstruct.gpio_pull    = GPIO_PULL_NONE;
  gpio_initstruct.gpio_pins    = GPIO_PINS_3;//PA3 PinZummer
  gpio_init(GPIOA, &gpio_initstruct);

  gpio_initstruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;//GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstruct.gpio_mode = GPIO_MODE_ANALOG;
  //PA1|PinBatVolt PA2|PinSourceVolt PA4|PinSensor6 PA5|PinSensor5
  gpio_initstruct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_4 | GPIO_PINS_5;
  gpio_init(GPIOA, &gpio_initstruct);
  
  gpio_initstruct.gpio_pins = GPIO_PINS_0;//PB0|PinSensor1
  gpio_init(GPIOB, &gpio_initstruct);

  //PC0|PinMeter1 PC1|PinMeter2 PC2|PinMeter3 PC3|PinMeter4 PC4|PinSensor3 PC5|PinSensor2   
  gpio_initstruct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_4 | GPIO_PINS_5;
  gpio_init(GPIOC, &gpio_initstruct);
}
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/17/2023 at 11:22 AM, 1113 said:

осталось проверить схему и код

код я привел, стопорю его фактически после инициализации сразу. Плата не моя, и к сожалению нет CAD исходника, да и EasyEda там(((

Но щаз уже ручками прозвоню, ок. Вдруг ктото накосячил(( 

 

Такто я общественности не всю правду сказал. Там один вход АЦП используется для оцифровки двух значений. Полная схема канала АЦП на картинке. Мое изобретение(, пришлось так сделать тк пинов не хватает. Я поочередно запитываю то один, то другой PIN_POWER_SENSORx для соответственно измерений в каждом канале.

tmp.jpg

 

Так, я все понял)) Мой косяк) Схема моя так работает, что подпитывает током входа по кругу(

Придется потерять полшкалы, тогда оно работает, это я уже методом тыка нашел)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, fpga_student сказал:

Прерывание в режиме ADC12_ORDINARY_TRIG_SOFTWARE на выборку серии каналов не генерируется вовсе - это у артери фича а не баг

подскажите, откуда информация? не смог найти в Reference Manual

Изменено пользователем tren359

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, fpga_student сказал:

gpio_initstruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;

я бы попробовал сбросить этот параметр перед инициализацией аналоговых сигналов. Не знаю как в Artery это обозвали, но подставить что-то типа настройки на вход (INPUT_OPEN_DRAIN).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/17/2023 at 11:34 AM, Edit2007 said:

я бы попробовал сбросить этот параметр перед инициализацией аналоговых сигналов. Не знаю как в Artery это обозвали, но подставить что-то типа настройки на вход (INPUT_OPEN_DRAIN).

Это параметр OUTPUT.

 

Вот определение этого параметра: 

typedef enum{
  GPIO_OUTPUT_PUSH_PULL                  = 0x00, /*!< output push-pull */
  GPIO_OUTPUT_OPEN_DRAIN                 = 0x04  /*!< output open-drain */
} gpio_output_type;

 

GPIO_OUTPUT_OPEN_DRAIN я уже пробовал без изменений. Но имхо както было бы странно, если бы Artery прописали GPIO_OUTPUT_PUSH_PULL в настройках АЦП в десятке примеров и Appnote, везде одно и тоже, и везде с ошибкой. Примеры-то рабочие

 

On 10/17/2023 at 11:33 AM, tren359 said:

подскажите, откуда информация? не смог найти в Reference Manual

 

Да я тоже долго волосы рвал. Ща попробую найти

 

Channel conversion end flag ( CCE )

Indicates that the normal/preemption channel conversion is completed. The software can write zero to itself or clear it by reading the ODT register. It has the ability to generate interrupts. Set after the normal/preempted channel sequence conversion is completed, the application can use this flag to read the conversion data of the normal/preempted channel. 

Notice:

There is only one ordinary channel data register, and the CCE flag will only be set when the sequence conversion is completed. In multi-channel applications, if the data is obtained by querying the CCE status, only the last channel data of the sequence can be obtained each time, resulting in data loss. Therefore, ordinary channel data must be obtained using DMA . DMA reading of conversion data will clear the CCE flag synchronously .

 

 

■     CPU reads common channel data (single channel)

This method is only applicable when the number of ordinary channels is 1. The software sets the CCEEN bit of ADC_CTRL 1 to enable the channel conversion end interrupt, and the ordinary channel data is obtained by the CPU reading the ordinary channel data register ( ADC_ODT ).

■     DMA reads ordinary channel data (non-master-slave mode)

In non-master-slave mode, ordinary channel data is stored in the ADC's own independent data register. The software sets the OCDMAEN bit to generate a DMA request every time the ordinary data register is updated, and the DMA reads the conversion data every time a DMA request is received.

 

Когда совсем приперло, перевел AN0112_AT32F403A_407_ADC_Application_Note_ZH_V2.0.0 с китайского(

Сразу на английском есть AN0093_AT32F435_437_ADC_Application_Note_EN_V2.0.1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...