fpga_student 0 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба Добрый день. Пытаюсь запустить АЦП у 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 пытался как на ходу, когда непрерывно идут измерения, так и при останове процессора в брекпойнт, когда измерений нету. Смотрю все осциллографом, прибавка напряжения постоянная, как будто в пине АЦП подтяжка включена. Но подтяжки там не может быть(( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1113 5 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба убедитесь что внутри вывода не включены подтяжки и тп резисторы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fpga_student 0 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба On 10/16/2023 at 6:17 PM, 1113 said: убедитесь что внутри вывода не включены подтяжки и тп резисторы там штатный конфиг из appnote adc. В аналоговом режиме подтяжка отключается сама. такто единственное разумное что в голову приходит. Но нет. Сейчас подал 0 на PIN_POWER_SENSOR1 и встал в брекпойнт, на PIN_SENSOR_1 вместо 1В стал круглый 0(( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tren359 2 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба АЦП опрашивает только один канал? У Артери каналы неплохо так влияют друг на друге при последовательном опросе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fpga_student 0 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба 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)( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tren359 2 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба Я сталкивался с тем, что, если канал, на котором точно ноль, обрабатывается после канала, на котором единица, то АЦП выдаст ненулевое значение на высоких частотах обработки. (не важно, ставить breakpoint или нет). Также сталкивался с тем, что не всегда гененрируется прерывание по окончанию последовательного преобразования - использовал DMA и в результате все значения смещались. AT32F413RCT7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dOb 8 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба У вас высокое выходное сопротивление делителя. Оно вместе с входной ёмкостью АЦП составляет задержку. Необходимо выбрать Sample time чтоб входная ёмкость успевала перезарядиться. Посмотри в DataSheet. Например для AT32F407 это 10пФ. То есть нужно подождать 1мкс. Если подключить осциллограф непосредственно на ножку, то будет виден небольшой пичёк напряжения, вызванный перезарядкой этой ёмкости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fpga_student 0 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба 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В постоянного смещения, и вопрос был бы исчерпан Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1113 5 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба на другом экземпляре то же самое? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fpga_student 0 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1113 5 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба осталось проверить схему и код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fpga_student 0 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба On 10/17/2023 at 11:22 AM, 1113 said: осталось проверить схему и код код я привел, стопорю его фактически после инициализации сразу. Плата не моя, и к сожалению нет CAD исходника, да и EasyEda там((( Но щаз уже ручками прозвоню, ок. Вдруг ктото накосячил(( Такто я общественности не всю правду сказал. Там один вход АЦП используется для оцифровки двух значений. Полная схема канала АЦП на картинке. Мое изобретение(, пришлось так сделать тк пинов не хватает. Я поочередно запитываю то один, то другой PIN_POWER_SENSORx для соответственно измерений в каждом канале. Так, я все понял)) Мой косяк) Схема моя так работает, что подпитывает током входа по кругу( Придется потерять полшкалы, тогда оно работает, это я уже методом тыка нашел) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tren359 2 17 октября, 2023 Опубликовано 17 октября, 2023 (изменено) · Жалоба 34 минуты назад, fpga_student сказал: Прерывание в режиме ADC12_ORDINARY_TRIG_SOFTWARE на выборку серии каналов не генерируется вовсе - это у артери фича а не баг подскажите, откуда информация? не смог найти в Reference Manual Изменено 17 октября, 2023 пользователем tren359 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба 12 минут назад, fpga_student сказал: gpio_initstruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; я бы попробовал сбросить этот параметр перед инициализацией аналоговых сигналов. Не знаю как в Artery это обозвали, но подставить что-то типа настройки на вход (INPUT_OPEN_DRAIN). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fpga_student 0 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться