реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Настройка ШИМ, как правильно рассчитать параметры ШИМ AT91SAM7S256
r00t31337
сообщение Jan 1 2010, 12:06
Сообщение #1





Группа: Участник
Сообщений: 3
Регистрация: 6-05-08
Пользователь №: 37 332



Здравствуйте!
Возникла задача сгенерировать ШИМ с частотой 50Гц и длительностью управляющего импульса 1,5мс. В наличии отладочная плата OLIMEX SAM7-P256. Как правильно рассчитать параметры для генерации ШИМ? Посоветуйте какую книгу лучше почитать по этой теме.

p.s. в интернете и на форуме искал, но ничего не нашел...

С уважением, Антон
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 1 2010, 12:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Все очень просто:
1. Определяем делитель, исходя из частоты MCK (предположим, 48MHz), доступной разрядности (16 бит) и частоты ШИМ (50Hz):
48000000 / 2^16 / 50 = 14.65, берем ближайший больший - 16.
2. Находим значение PERIOD = 48000000 / 16 / 50 = 60000
3. Находим значение DUTY = 60000 / 20мс * 1.5мс = 4500
Но это если не требуется степень двойки в периоде.
Go to the top of the page
 
+Quote Post
r00t31337
сообщение Jan 1 2010, 14:07
Сообщение #3





Группа: Участник
Сообщений: 3
Регистрация: 6-05-08
Пользователь №: 37 332



aaarrr, спасибо за Ваш ответ!

На сколько я понял, частоту MCK задает кварцевый резонатор (18,432MHz), тогда для моего случая:
1. Делитель: 18432000/2^16/50 = 5,625 ближайший большой 8
2. Значение PERIOD: 18432000/8/50 = 46080
3. Значение DUTY: 46080/20мс * 1,5мс = 3456

Так я попробовал реализовать
Код
AT91C_BASE_PWMC->PWMC_DIS = 0x0F;
AT91C_BASE_PMC->PMC_PCER =  (1<<AT91C_ID_PWMC);
//PWM0 output PA11, Peripheral B
AT91C_BASE_PIOA->PIO_PDR = (1 << 11);
AT91C_BASE_PIOA->PIO_BSR = (1 << 11);
AT91C_BASE_PWMC->PWMC_MR =    0x04010401;
AT91C_BASE_PWMC->PWMC_CH[0].PWMC_CMR = AT91C_PWMC_CPRE_MCK/8; //Channel Mode Register
AT91C_BASE_PWMC->PWMC_CH[0].PWMC_CDTYR = 3456; //Channel Duty Cycle Register
AT91C_BASE_PWMC->PWMC_CH[0].PWMC_CPRDR = 46080; //Channel Period Register
AT91C_BASE_PWMC->PWMC_ENA = 1; //PWMC Enable Register

К отладочной плате подключаю сервопривод, который при частоте 50Гц и длительности управляющего шага 1,5мс должен встать по середине, но он поворачивается в одну из сторон до упора. Попробовал несколько вариантов, но они результатов не дали. Где-то что-то сделал не так.

Извиняюсь, если мое сообщение покажется большой глупостью, я только учусь))

Сообщение отредактировал r00t31337 - Jan 1 2010, 14:13
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 1 2010, 15:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(r00t31337 @ Jan 1 2010, 17:07) *
На сколько я понял, частоту MCK задает кварцевый резонатор (18,432MHz)...

...и PLL, если используется. Если не уверены, проверьте, какая частота на самом деле получается. Проще всего для этого вывести клок на какой-нибудь из пинов PCK.

Цитата(r00t31337 @ Jan 1 2010, 17:07) *
Код
AT91C_BASE_PWMC->PWMC_DIS = 0x0F;
AT91C_BASE_PMC->PMC_PCER =  (1<<AT91C_ID_PWMC);

Не страшный косяк, но все же: запись PWMC_DIS должна следовать после разрешения тактирования модуля PWM.

Цитата(r00t31337 @ Jan 1 2010, 17:07) *
Код
AT91C_BASE_PWMC->PWMC_MR =    0x04010401;
AT91C_BASE_PWMC->PWMC_CH[0].PWMC_CMR = AT91C_PWMC_CPRE_MCK/8; //Channel Mode Register

Здесь сконфигурировали clkA и clkB как MCK/16, но в канале 0 выбрали в качестве клока MCK: AT91C_PWMC_CPRE_MCK/8 = 0/8 = AT91C_PWMC_CPRE_MCK.
Для MCK/8 надо было или записать 3 в CMR, или 0x301 в MR и AT91C_PWMC_CPRE_MCKA в CMR.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016