snn_krs
Members-
Постов
568 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Весь контент snn_krs
-
Попробуйте это. Скомпилировался без проблем. Ардуино ИДЕ 1.8.3
-
В цикле ожидается установка флага TWINT. Устанавливается он аппаратно. Возможно на вашей плате выходы SDA или SCL используются для других целей. Посмотрите какие на них напряжения при запущенной программе.
-
Извиняюсь, похоже вчера был пьян. У вас скорее всего висит на ожидании флага Закоментируйте оба вызова функций, затем по одной. Узнаете точнее на какой функции висит.
-
Прерывания разрешить не забыли ?
-
Была аналогичная проблема с STM32F373 и SDADC. Разбираться было некогда. Попробуйте обработать ошибку в прерывании DMA. Если DMA пропускает запрос от периферии он должен выставить флаг ошибки.
-
В руководстве по программированию есть такое требование: For write and erase operations on the Flash memory (write/erase), the internal RC oscillator (HSI) must be ON Проверьте на всякий случай включен у вас HSI или нет. При запуске он всегда включен, но если работаете на внешнем кварце, то могли выключить.
-
Сам я именно такой вариант не делал, но попробовал бы сделать так Таймер TIMN сделал ведущим с частотой 20 кГц * 16. TIMM ведомый с запуском от TIMN и счетом до 16, его выход в режиме переключения выдает меандр с частотой 20 кГц. По TIMN запуск АЦП + ДМА. В буфере будут по четным адресам 0-й канал, а по нечетным поочереди 1, 2 каналы.
-
Да, это пустой цикл ожидания установки флага UDRE.
-
Обычно , если надо передать один символ, делают так void sendusart( unsigned char but ) { while ( !( UCSRA&( 1 << UDRE ))); UDR = but; }
-
Попробуйте вставить такое перед #include <util/delay.h> , иногда помогает в АС7 #define __DELAY_BACKWARD_COMPATIBLE__
-
Все отлично работает. Покажите полный код с обеих устройств, тогда можно будет сказать, где ошибка.
-
Наверно лучший вариант взять STM32F103 с двумя АЦП. Там они будут работать независимо. На вашем можно сделать иначе. Если 3 преобразования не получается, то делайте по 2. При 22 кГц время между двумя выборками 2.8 мкс ( меандр 45 мкс и 16 выборок = 2.8 мкс ). При Sample time = 1.5 время одного преобразования 1.17 мкс и двух соответственно 2.34 мкс.Делаете регулярные группы 0, 1, 0, 2 и запускаете по два канала. В буфере будет по 32 значения, канал 0 обрабатываете постоянно, а 1 и 2 по желанию.
-
Думаю лучше задавать частоту одного таймера более высокочастотного, а второй запускать от него с постоянным делителем например 10. Книга называется "Мартин М. Инсайдерское руководство по STM32". Если не найдете могу скинуть.
-
Похоже я не правильно понял. Запускать можно группу каналов, но если вам надо равномерно распределять выборки по меандру, то конечно надо второй таймер. Я имел ввиду вот такие преобразования.
-
Да. Обработку я делаю по прерываниям от ДМА - половина буфера и полный. Пока обрабатываю первую половину, заполняется вторая.
-
Зачем два таймера. АЦП сам запускает ДМА по окончанию каждого преобразования. У АЦП есть режим запуска по триггеру. Таймер будет запускать все 10 преобразований по вашему меандру. Только посмотрите какие таймеры и по какому событию могут запускать АЦП.
-
Максимальная частота АЦП 12 МГц. Около 850 000 преобразований в секунду. Другая периферия на время преобразования не влияет. В ДМА лучше для АЦП поставить высший приоритет.
-
Делал типа такого ADC_InitStr.ADC_ContinuousConvMode = ENABLE; ADC_InitStr.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStr.ADC_Mode = ADC_Mode_Independent; ADC_InitStr.ADC_NbrOfChannel = 4; ADC_InitStr.ADC_ScanConvMode = ENABLE; ADC_InitStr.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_Init( ADC1, &ADC_InitStr ); ADC_RegularChannelConfig( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig( ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig( ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig( ADC1, ADC_Channel_TempSensor, 4, ADC_SampleTime_239Cycles5 ); ADC_TempSensorVrefintCmd( ENABLE ); ADC_DMACmd( ADC1 , ENABLE ); ADC_Cmd( ADC1, ENABLE ); ADC_InitStr.ADC_NbrOfChannel = 4; - это число каналов в группе ставите 16 ADC_RegularChannelConfig( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); - число 1 - канал 0 будет запущен первым и т. д. Лучше порядок преобразований и число задать через регистры ADC_SQR1, ADC_SQR2 и ADC_SQR3. ADC_SQR1 = 0х00F00000; - типа такого.
-
Если устроит, то есть регулярные каналы и можно настроить групповое преобразование. В группе может быть до 16 каналов. Можно сделать 14 преобразований важного канала и 2 преобразования вспомогательных каналов. При этом можно задать любой порядок следования каналов например: 1,1,2,1,1,3,1,1... Не надо будет перенастраивать, ДМА будет складывать так как зададите. Число каналов и последовательность задается в регистрах ADC_SQR1,2,3.
-
Верхние транзисторы не открываются полностью. Обычно в верхнее плечо ставят pnp транзисторы. Другой вариант поставить готовые драйверы.