stm32f103c8 ШИМ и АЦП
-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
stm32f103c8 ШИМ и АЦП
есть задача: генерировать ШИМ и считывать реакцию объекта на эти импульсы посредством АЦП.
всё сделал как надо:
проц завёл на 56 МГц, что бы АЦП работал на 14 МГц (1 выборка за 1 мкс)
подключил ДМА к АЦП, что бы оперативно складывать всё в буфер
настроил таймер для ШИМ: ШИМ инверсный, частота 40 кГц, скважность 50%
выключение ШИМ по достижении счетчика импульсов (эти занимается обработчик прерывания по флагу UIF)
соединил напрямую (для теста) выход ШИМ и вход АЦП
запускаю, смотрю результат:
в момент включения таймера АЦП регистрирует высокий уровень на ноге ШИМ в течение двух измерений, далее ШИМ работает и отключается как ожидалось.
делал запуск АЦП по прерыванию CCIE (мне нужно стартовать АЦП именно в момент подачи импульса) - всё равно эти два значения высокого уровня.
начал экспериментровать и понял, что эти "паразитные всплески" связаны именно с началом работы таймера
включил АЦП
какая-то задержка
инициализировал (но не включил) таймер
ещё какая-то задержка
включил таймер
продолжаю работу ШИМ и АЦП с заданным алгоритмом.
Что в итоге:
после запуска АЦП до инициализации таймера - регистрируются случайные значения (очевидно порт висит в воздухе и ловит помехи)
после инициализации до старта таймера - регистрируется низкий уровень
в момент старта таймера - высокий уровень (в течение 2мкс)
далее всё в порядке, согласно ожиданиям.
наличие высокого уровня до начала измерений неприемлемо, ибо может повлиять на результат измерений.
если с мусором пока порт висит в воздухе я могу справиться введением дополнительного аппаратного ключа, то как побороть эти "паразитные всплески"?
почему в момент старта таймера регистрируется событие CCIF (вставлял запуск АЦП в обработчик этого прерывания)?
как побороть этот баг?
всё сделал как надо:
проц завёл на 56 МГц, что бы АЦП работал на 14 МГц (1 выборка за 1 мкс)
подключил ДМА к АЦП, что бы оперативно складывать всё в буфер
настроил таймер для ШИМ: ШИМ инверсный, частота 40 кГц, скважность 50%
выключение ШИМ по достижении счетчика импульсов (эти занимается обработчик прерывания по флагу UIF)
соединил напрямую (для теста) выход ШИМ и вход АЦП
запускаю, смотрю результат:
в момент включения таймера АЦП регистрирует высокий уровень на ноге ШИМ в течение двух измерений, далее ШИМ работает и отключается как ожидалось.
делал запуск АЦП по прерыванию CCIE (мне нужно стартовать АЦП именно в момент подачи импульса) - всё равно эти два значения высокого уровня.
начал экспериментровать и понял, что эти "паразитные всплески" связаны именно с началом работы таймера
включил АЦП
какая-то задержка
инициализировал (но не включил) таймер
ещё какая-то задержка
включил таймер
продолжаю работу ШИМ и АЦП с заданным алгоритмом.
Что в итоге:
после запуска АЦП до инициализации таймера - регистрируются случайные значения (очевидно порт висит в воздухе и ловит помехи)
после инициализации до старта таймера - регистрируется низкий уровень
в момент старта таймера - высокий уровень (в течение 2мкс)
далее всё в порядке, согласно ожиданиям.
наличие высокого уровня до начала измерений неприемлемо, ибо может повлиять на результат измерений.
если с мусором пока порт висит в воздухе я могу справиться введением дополнительного аппаратного ключа, то как побороть эти "паразитные всплески"?
почему в момент старта таймера регистрируется событие CCIF (вставлял запуск АЦП в обработчик этого прерывания)?
как побороть этот баг?
- Реклама
Re: stm32f103c8 ШИМ и АЦП
а временно блокировать выход таймера?
аппаратно входом ETRF или программно.
вроде можно поискать варианты.
" (мне нужно стартовать АЦП именно в момент подачи импульса)"
идеала не существует в природе, что-то может/должно быть раньше.
почему бы "не спрятать" переходные процессы.
аппаратно входом ETRF или программно.
вроде можно поискать варианты.
" (мне нужно стартовать АЦП именно в момент подачи импульса)"
идеала не существует в природе, что-то может/должно быть раньше.
почему бы "не спрятать" переходные процессы.
-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
Re: stm32f103c8 ШИМ и АЦП
Ну я пока так и поступил, запускаю ШИМ, пропускаю пару импульсов, по событию СС запускаю АЦП и подключаю ШИМ к объекту.
ПС. Кто нибудь может скинуть пример на CMSIS как работать с АЦП в dual mode на один канал? Dual fast interleaved mode называется
В аппноте AP3116 написано что там можно, а примера нет
Добавлено after 1 hour 48 minutes 42 seconds:
А всё, разобрался...
ПС. Кто нибудь может скинуть пример на CMSIS как работать с АЦП в dual mode на один канал? Dual fast interleaved mode называется
В аппноте AP3116 написано что там можно, а примера нет
Добавлено after 1 hour 48 minutes 42 seconds:
А всё, разобрался...
-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
Re: stm32f103c8 ШИМ и АЦП
[uquote="a797945",url="/forum/viewtopic.php?p=3914492#p3914492"]а временно блокировать выход таймера?
аппаратно входом ETRF или программно.[/uquote]
а можно про ETRF поподробнее?
как можно блокировать выход таймера?
сейчас я сделал доп канал который включает питание ШИМ.
выгладит это так между фронтом ШИМ и включением питания ШИМ есть задержка хотелось бы избавиться от доп канала
и убрать этот непонятный всплеск в начале.
аппаратно входом ETRF или программно.[/uquote]
а можно про ETRF поподробнее?
как можно блокировать выход таймера?
сейчас я сделал доп канал который включает питание ШИМ.
выгладит это так между фронтом ШИМ и включением питания ШИМ есть задержка хотелось бы избавиться от доп канала
и убрать этот непонятный всплеск в начале.
Re: stm32f103c8 ШИМ и АЦП
"а можно про ETRF поподробнее?"
так это аппаратно, если f10x - rm0008, 15.3.11 Clearing the OCxREF signal on an external event
может у Вас нет этого (после загрузки регистров, до старта):
TIM3->EGR |= TIM_EGR_UG; - принуждает обновить теневые регистры
так это аппаратно, если f10x - rm0008, 15.3.11 Clearing the OCxREF signal on an external event
может у Вас нет этого (после загрузки регистров, до старта):
TIM3->EGR |= TIM_EGR_UG; - принуждает обновить теневые регистры
- Реклама
-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
Re: stm32f103c8 ШИМ и АЦП
TIM_EGR_UG убрал лишний всплеск, спасибо!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: stm32f103c8 ШИМ и АЦП
[uquote="a797945",url="/forum/viewtopic.php?p=3919738#p3919738"]TIM3->EGR |= TIM_EGR_UG; - принуждает обновить теневые регистры[/uquote]Регистр EGR только для записи. Правильно вот так
Код: Выделить всё
TIM3->EGR = TIM_EGR_UG;-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
Re: stm32f103c8 ШИМ и АЦП
Правильно так, работает и так |=.
По сути читаем мы нули...
По сути читаем мы нули...
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: stm32f103c8 ШИМ и АЦП
Я не писал работает или нет. Я писал правильно или нет.


