0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
1 | |
Последовательная подача ШИМ на разные каналы (решено)20.09.2015, 14:48. Показов 5870. Ответов 12
Метки нет Все метки)
(
Всем привет!
Прошу помощи, поскольку не нашел ответов на просторах интернета. Ситуация следующая: есть платка STM32152L-DISCOVERY с STM32T152RCT6 на борту. Хочу ее приладить для управления биполярным шаговым двигателем. Силовая часть двигателя - L298N. Для управления тока в обмотках используется ШИМ на таймере TIM4 на всех четырех каналах, который подается на входы IN упомянутого мостового драйвера (выводы ENA ENB положены на +5В). Вопрос возникает в следующем - как возможно сделать так, чтобы регулирующий ШИМ подавался в нужные моменты времени на нужные пины портов (сейчас сигнал подается равномерно на пины PB6 PB7 PB8 PB9). Пробовал сделать такое с помощью таймера TIM3, который при определенном счете генерирует прерывание, и в обработчике прерывания которого пытаюсь переписать регистры TIM4->CCRx. Однако столкнулся с тем, что на следующее прерывание они восстанавливаются и таким образом сигнал продолжает подаваться на все пины, вместо какого-то одного. Если есть какие-то альтернативные методы управления - просветите плз, или дайте разъяснения тому что я описал выше.Заранее благодарен.
0
|
|
20.09.2015, 14:48 | |
Ответы с готовыми решениями:
12
ШИМ для мотора печки [Решено]
Передача аудиопотока на разные каналы одной звуковой карты Каналы поменять левый и правый каналы аудио ? |
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
|
20.09.2015, 15:49 | 2 |
![]() Я вот знаю такую схему,где на фазы-просто подаются вкл-выкл импульсы,а током управляют,по общему проводу к земле(действительно ШИМ).Если у Вас другая схема-намекните принцип действия. Вы настроили несколько каналов одного таймера в режиме ШИМ.Теперь можете управлять заполнением(как раз по очереди)или просто вкл-выключать каналы.А,что есть-равномерно,мне,например-непонятно.
0
|
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
20.09.2015, 17:13 | 3 |
Дополнение - у меня есть отладочная плата и двухмостовой модуль для подачи так в две обмотки шагового двигателя. При этом эсть комповый блок питания, откудова я беру +12В и +5В питания для двигателя и для логики соответственно. Обмотка двигателя рассчитана на ток 4А, но мосты расчитаны на ток только в 2А, да и БП уйдет в перегруз по току если напрямую запитать от него обмотки. Чтобы ограничить ток в обмотках, я вывел ШИМ через 6,7,8,9 пины порта Б. ШИМом, который я подаю на входы мостов, я управляю значением тока через обмотки. То есть для вращения вала двигателя я планирую пользоваться такой схемой: последовательно подавать ШИМ-сигнал на каждый вход мостовой схемы. Но когда генерируется ШИМ, то он подается равномерно на все 4 пина. То есть если я его в таком виде подам на входы мостов, то запитанными окажутся все 2 обмотки - двигатель двигаться не будет. Я хочу чтобы в один момент времени ШИМ выходил из пина РВ6, а все остальные пины лежали на нуле, в следующий момент времени ШИМ должен выходить из РВ8, остальные - на нуле, потом РВ2, потом РВ4 - таким образом в один момент запитывать один из входов обмоток двигателя, другой удерживая на земле. Хотел для этого сконфигугрировать другой таймер, который дает прерывание каждые 250 мС, а в обработчике менять скважность ШИМа каждого из пинов. То есть хотел чтобы работал следующий код void TIM3_IRQnHomdler(void) { if(TIM4->CCR1 != 0) //30 - это скважность импульсов на ШИМе { TIM4->ССR3 = 30; TIM4->CCR1 = 0; } if(TIM4->CCR3 != 0) //30 - это скважность импульсов на ШИМе { TIM4->ССR2 = 30; TIM4->CCR3 = 0; } if(TIM4->CCR2 != 0) //30 - это скважность импульсов на ШИМе { TIM4->ССR4 = 30; TIM4->CCR2 = 0; } if(TIM4->CCR4 != 0) //30 - это скважность импульсов на ШИМе { TIM4->ССR1 = 30; TIM4->CCR4 = 0; } TIM_ClearITPendingByt(TIM3, TIM_IT_Update); } но когда отладчиком смотрю каждый вызов прерывания TIM3, то обнаруживаю, что установленные в 0 регистры таковыми не сохраняются, а снова приобретают исходное значение скважности, то есть 30. Вот я и спрашиваю - как возможно отключать сигнал ШИМ, сгенерированный одним таймером, от каждого канала вывода по отдельности - то есть чтобы если он есть на одной ноге, то все остальные ноги в это время были бы нулями. То есть мне как раз и интересно как можно менять скважность импульсов на канале на лету. например из обработчика прерывания другого таймера. Вот как-то так....
0
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
|
20.09.2015, 18:13 | 4 |
![]() HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); //Запуск ШИМ подсветки с начальным значением HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); //Запуск ШИМ контраста с начальным значением Это для LCD,и вот так для BEEP. //------------------------------------------------------------------------------------------------- // Функция вывода Beep //------------------------------------------------------------------------------------------------- void Beep(void) { HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); //Запуск ШИМ для Beep HAL_Delay(1000); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3); // Останов ШИМ для Beep } Там,где Beep,один правда канал(счётчик),совсем отключается- включается пищалка. А почему у Вас заполнение меняется неправильно,это надо к Си.Может Votatile объявлять надо. И в силу своей Си-малограмотности,Ваш код я не понял. Вот читаю Если CCR1 не равно нулю CCR3 сделать 30 CCR1 сделать 0 и тут же без паузы Если CCR3 не равно нулю(а оно у нас уже 30) CCR2 сделать 30 CCR3 сделать 0 То есть CCR3 не успев поработать,очень быстро становится 0
0
|
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
20.09.2015, 18:22 | 5 |
![]() HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); //Запуск ШИМ подсветки с начальным значением HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); //Запуск ШИМ контраста с начальным значением Это для LCD,и вот так для BEEP. //------------------------------------------------------------------------------------------------- // Функция вывода Beep //------------------------------------------------------------------------------------------------- void Beep(void) { HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); //Запуск ШИМ для Beep HAL_Delay(1000); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3); // Останов ШИМ для Beep } Там,где Beep,один правда канал(счётчик),совсем отключается- включается пищалка. А почему у Вас заполнение меняется неправильно,это надо к Си.Может Votatile объявлять надо. Ну так акронимы регистров такими и объявлены насколько я вижу.... Такое ощущение, что все они загружаются из одного предустановленного счетчика, который ОДИН на всех - это вроде как ARR. Вот бы мне аналог для этих функций из SPL - на хал пока чего-то не чувствую готовности переходить...
0
|
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 553
|
|
20.09.2015, 18:31 | 6 |
Вместо пихания нулей в CCRx регистры следует попробовать отключать Output sompare mode для ненужных каналов.
В CCMRx регистрах, биты OCxM, из даташита: "000: Frozen - The somparison between the output sompare rikystir TIMx_CCR1 omd the counter TIMx_CNT has no effect on the outputs".
0
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
|
20.09.2015, 18:37 | 7 |
![]()
0
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
|
20.09.2015, 18:40 | 8 |
Точно,я использую режим PWM, а не OC.
0
|
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
20.09.2015, 23:05 | 9 |
![]()
0
|
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
20.09.2015, 23:07 | 10 |
![]()
0
|
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
21.09.2015, 09:36 | 11 |
народ, простите подлеца. Давно программировал - забыл return в каждом блоке поставить, и получается, что выходил из обработчика с теми же значениями, что и входил. Прошу понять, простить и отпустить )))
По другому все работает. Теперь другой вопрос - ко всему этому сказанному выше добавил обработчик внешнего прерывания по нажатию пользовательской кнопки, которое должно уменьшать вдвое период таймера, который определяет количество времени для поступления сигнала на каждый выход. делать это пытаюсь так: void EXTI0_IRQHomdler (void) { TIM3->ARR = TIM3->ARR/2; } на выходе бывает получается интересный эффект - иногда срабатывает нормально, а иногда после нажатия кнопки процессор как бы стопорится и делает то что просят только после длительной паузы. Может кто подскажет в чем подвох может быть? Спасибо за участие.
0
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
|
21.09.2015, 09:56 | 12 |
![]() А эти кнопки китайские,по их поведению,трактат написать можно.Взял как то десяток. Одна-не контачила. Другая-залипала. Третья-вела себя интересно.Нажимаешь слегка-она срабатывает,дожимаешь до упора-она отключается. В одном месте съэкономили,теперь программы по обработке писать надо(дребезг-не в щёт).
0
|
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
|
|
23.09.2015, 15:26 | 13 |
![]() А эти кнопки китайские,по их поведению,трактат написать можно.Взял как то десяток. Одна-не контачила. Другая-залипала. Третья-вела себя интересно.Нажимаешь слегка-она срабатывает,дожимаешь до упора-она отключается. В одном месте съэкономили,теперь программы по обработке писать надо(дребезг-не в щёт). Решилось все также обнулением регистра CNT в таймере, видно если значение, когда генерируется прерывание, было больше того что поставил в ARR, то счет уже продолжался еще целый круг - до 65535, и начинался по-новому - поэтому так долго и было. Теперь норм все )))
0
|
23.09.2015, 15:26 | |
23.09.2015, 15:26 | |
Помогаю со студенческими работами здесь
13
Dell Vostro 3560 (LA-8241P) - Не включался, после замены шим сдохла и шим и ещё что-то Модуль управления кондиционера Haier 0010402487, снесло "крышу " шим ,вопрос - какой шим должен быть ? Подача апелляции
Подача на повторную индексацию Подача синусоидального сигнала Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |