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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2015, 14:48
Ответы с готовыми решениями:

Последовательная подача байта на ногу МК
Есть переменная char a = 0xDC. Как ее последовательно подать на ногу PB1? На языке С. Делаю вот что...

ШИМ для мотора печки [Решено]
Машина М2141, мотор печки довольно мощный. Коллекторный. Заявлено 90 Вт мощности, 12 вольт, 15 А,...

Одновременная маршрутизация через разные каналы
микротик 1 - офис 192.168.11.0/24 один WAN (белый IP статика) - я сижу в офисе микротик 2 - склад...

Передача аудиопотока на разные каналы одной звуковой карты
Доброго всем! Имею: Звуковую карту 7.1, сетевой аудио поток который генерирую с помощью libVLC и...

Каналы поменять левый и правый каналы аудио ?
Как поменять каналы правый на левый, в играх приходится постоянно поворачивать наушники а модель...

12
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
20.09.2015, 15:49 2
Цитата Сообщение от kiksyy
Всем привет!
Прошу помощи, поскольку не нашел ответов на просторах интернета.
Ситуация следующая: есть платка STM32152L-DISCOVERY с STM32T152RCT6 на борту. Хочу ее приладить для управления биполярным шаговым двигателем. Силовая часть двигателя - L298N. Для управления тока в обмотках используется ШИМ на таймере TIM4 на всех четырех каналах, который подается на входы IN упомянутого мостового драйвера (выводы ENA ENB положены на +5В).
Вопрос возникает в следующем - как возможно сделать так, чтобы регулирующий ШИМ подавался в нужные моменты времени на нужные пины портов (сейчас сигнал подается равномерно на пины PB6 PB7 PB8 PB9). Пробовал сделать такое с помощью таймера TIM3, который при определенном счете генерирует прерывание, и в обработчике прерывания которого пытаюсь переписать регистры TIM4->CCRx. Однако столкнулся с тем, что на следующее прерывание они восстанавливаются и таким образом сигнал продолжает подаваться на все пины, вместо какого-то одного.
Если есть какие-то альтернативные методы управления - просветите плз, или дайте разъяснения тому что я описал выше.Заранее благодарен.
Тут,тоже не понятно,что спрашивается.Я признаю,что иногда,мне нужно больше времени,чем другим людям,чтобы понять вопрос.Но,я интересовался,схем управления ШД-много.Ваша задумка,может быть не всем понятна.
Я вот знаю такую схему,где на фазы-просто подаются вкл-выкл импульсы,а током управляют,по общему проводу к земле(действительно ШИМ).Если у Вас другая схема-намекните принцип действия.
Вы настроили несколько каналов одного таймера в режиме ШИМ.Теперь можете управлять заполнением(как раз по очереди)или просто вкл-выключать каналы.А,что есть-равномерно,мне,например-непонятно.
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
Цитата Сообщение от kiksyy
Вот я и спрашиваю - как возможно отключать сигнал ШИМ, сгенерированный одним таймером, от каждого канала вывода по отдельности - то есть чтобы если он есть на одной ноге, то все остальные ноги в это время были бы нулями.
То есть мне как раз и интересно как можно менять скважность импульсов на канале на лету. например из обработчика прерывания другого таймера.
Вот как-то так....
Да наверно так же.Я только на другом контроллере и с применением библиотеки HAL.А вы на регистрах и другого процессора.У меня это вот так
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
Цитата Сообщение от Movysi
Цитата Сообщение от kiksyy
Вот я и спрашиваю - как возможно отключать сигнал ШИМ, сгенерированный одним таймером, от каждого канала вывода по отдельности - то есть чтобы если он есть на одной ноге, то все остальные ноги в это время были бы нулями.
То есть мне как раз и интересно как можно менять скважность импульсов на канале на лету. например из обработчика прерывания другого таймера.
Вот как-то так....
Да наверно так же.Я только на другом контроллере и с применением библиотеки HAL.А вы на регистрах и другого процессора.У меня это вот так
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
Цитата Сообщение от kiksyy
Вот бы мне аналог для этих функций из SPL - на хал пока чего-то не чувствую готовности переходить...
А Вы,если не хотите-не переходите.Гуру считают,что это облегчалки и не круто.Может на регистрах,я бы еще и светодиод не зажёг.Можно просто посмотреть код HAL,где эти функции определены.Или просто в RM,какой бит отключать.
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
Цитата Сообщение от TomityWotf
Вместо пихания нулей в 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
Регистрация: 11.09.2015
Сообщений: 20
20.09.2015, 23:07 10
Цитата Сообщение от Movysi
Точно,я использую режим PWM, а не OC.
Так у меня ОС в PWM Mode и находятся...
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
Цитата Сообщение от kiksyy
на выходе бывает получается интересный эффект - иногда срабатывает нормально, а иногда после нажатия кнопки процессор как бы стопорится и делает то что просят только после длительной паузы. Может кто подскажет в чем подвох может быть?
Может опять,что с программой,то пока не буду с советами лезть.
А эти кнопки китайские,по их поведению,трактат написать можно.Взял как то десяток.
Одна-не контачила.
Другая-залипала.
Третья-вела себя интересно.Нажимаешь слегка-она срабатывает,дожимаешь до упора-она отключается.
В одном месте съэкономили,теперь программы по обработке писать надо(дребезг-не в щёт).
0
0 / 0 / 0
Регистрация: 11.09.2015
Сообщений: 20
23.09.2015, 15:26 13
Цитата Сообщение от Movysi
Цитата Сообщение от kiksyy
на выходе бывает получается интересный эффект - иногда срабатывает нормально, а иногда после нажатия кнопки процессор как бы стопорится и делает то что просят только после длительной паузы. Может кто подскажет в чем подвох может быть?
Может опять,что с программой,то пока не буду с советами лезть.
А эти кнопки китайские,по их поведению,трактат написать можно.Взял как то десяток.
Одна-не контачила.
Другая-залипала.
Третья-вела себя интересно.Нажимаешь слегка-она срабатывает,дожимаешь до упора-она отключается.
В одном месте съэкономили,теперь программы по обработке писать надо(дребезг-не в щёт).

Решилось все также обнулением регистра CNT в таймере, видно если значение, когда генерируется прерывание, было больше того что поставил в ARR, то счет уже продолжался еще целый круг - до 65535, и начинался по-новому - поэтому так долго и было. Теперь норм все )))
0
23.09.2015, 15:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2015, 15:26
Помогаю со студенческими работами здесь

Dell Vostro 3560 (LA-8241P) - Не включался, после замены шим сдохла и шим и ещё что-то
Имеется бук бп в защиту не уходил, но ни на что не реагировал. После изучения схемы и проверки...

Модуль управления кондиционера Haier 0010402487, снесло "крышу " шим ,вопрос - какой шим должен быть ?
Фото модуля ...и шимки.. https://www.cyberforum.ru/savedimages/2015/04/28/3814729637.jpg...

Подача апелляции
Здравствуйте, Друзья/товарищи Хотел бы проявить интерес к такой возможности, как <b>подача...

Подача аргументов функции
Здравствуйте, работаю в Linux lubuntu в PostgreSQL через pgAdmin3. Имеется функция, которая после...

Подача на повторную индексацию
Добрый день :) Вопрос к бывалым в бане товарищам. Как раз перед праздниками полностью выпал из...

Подача синусоидального сигнала
Доброго времени суток! С помощью контроллера нужно подать синусоидальный сигнал вида A*sin(w*t) на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru