Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание на SAM7s
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
en0t
Есть микроконтролер AT91sam7s256
Задача: Получение прямоугольных импульсов от 1 Гц до 200 кГц с возможностью регулирования скважности.

Подскажите как проще сделать это.

Сам склоняюсь к использованию таймеров, но вот как оптимальней настроить и какие именно взять незнаю.

Кто знает подскажите, Зарание С П А С И Б О
KRS
Цитата(en0t @ Mar 12 2008, 13:00) *
Есть микроконтролер AT91sam7s256
Задача: Получение прямоугольных импульсов от 1 Гц до 200 кГц с возможностью регулирования скважности.

Так это же PWM
смотрите PWM controller или Waveform operating mode у таймеров.
xelax
Цитата(en0t @ Mar 12 2008, 13:00) *
Есть микроконтролер AT91sam7s256
Задача: Получение прямоугольных импульсов от 1 Гц до 200 кГц с возможностью регулирования скважности.

Подскажите как проще сделать это.

Сам склоняюсь к использованию таймеров, но вот как оптимальней настроить и какие именно взять незнаю.

Кто знает подскажите, Зарание С П А С И Б О


Проще всего это сделать через PWM (ШИМ). Настраивается форма, периодичность, скважность и т.д.
aaarrr
Для такой задачи можно использовать TC в Waveform Mode. С настройкой особых проблем, по-моему, нет.
en0t
не через ШИМ не получится т. к. в полученом сигнале пауза должна измерятся в микросекундах и соответственно изменятся тоже в них.
Вобшем на выходе должен получится генератор прямоугольных импульсов.

чёто типа вот этого:


http://www.telesys.ru/electronics/projects.php?do=p072

Может кто подскажет и покажет как настроить прерывание по переполнению таймер счётчика с частотой 200 кГц
aaarrr
Цитата(en0t @ Mar 12 2008, 13:29) *
не через ШИМ не получится т. к. в полученом сигнале пауза должна измерятся в микросекундах и соответственно изменятся тоже в них.

Не вижу связи между ШИМ'ом и микросекундами, поясните.
en0t
Цитата(aaarrr @ Mar 12 2008, 13:36) *
Не вижу связи между ШИМ'ом и микросекундами, поясните.


Не Не Не
ненадо о ШИМ'е я сразу его отмел, а вот о настройке прерывания если можно поподробней раскажите обьясните покажите.
aaarrr
Цитата(en0t @ Mar 12 2008, 13:39) *
ненадо о ШИМ'е я сразу его отмел

Почему?

Цитата(en0t @ Mar 12 2008, 13:39) *
раскажите обьясните покажите.

smile.gif Да легко. Вот только прерываться с частотой 200KHz не советую, впрочем, хозяин - барин.

Для 48MHz MCK:
Код
void timer0_ini(void)
{
    AT91C_BASE_PMC->PMC_PCER = (0x01 << AT91C_ID_TC0);

    // Wave mode, MCK/8,  UP mode with automatic trigger on RC Compare
    AT91C_BASE_TCB->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV2_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE;
    AT91C_BASE_TCB->TCB_TC0.TC_RC = 29;
    AT91C_BASE_TCB->TCB_TC0.TC_CCR = AT91C_TC_CLKEN;
    AT91C_BASE_TCB->TCB_TC0.TC_IER = AT91C_TC_CPCS;
    AT91C_BASE_TCB->TCB_TC0.TC_CCR = AT91C_TC_SWTRG;

    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0x07;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (u_int)tc0_irq_handler;
}
en0t
насчёт шима всё просто , процесор должен выдавать несколько таких частот притом разных (от 3 до 12)
вот я и подумал что проше всего использовать преполнение по т/c , вообшё планируется ипользование частот не более 10кГц , но для того чтобы чтото можно было регулировать на таких частотак длину паузы решил что для этого 200 кГц вполне должно хватить.

Скорей всего я выбрал путь не совсем правельный так что хотел услышать мнение профи как лутше это организоватью
aaarrr
Цитата(en0t @ Mar 12 2008, 13:54) *
насчёт шима всё просто , процесор должен выдавать несколько таких частот притом разных (от 3 до 12)
вот я и подумал что проше всего использовать преполнение по т/c , вообшё планируется ипользование частот не более 10кГц , но для того чтобы чтото можно было регулировать на таких частотак длину паузы решил что для этого 200 кГц вполне должно хватить.

Скорей всего я выбрал путь не совсем правельный так что хотел услышать мнение профи как лутше это организоватью

Понятно. Беда в том, что время между двумя прерываниями на 200КГц составит всего 48000000/200000=240 тактов процессора, что очень мало.

Учитывая "ногодрыгательную специфику" задачи, я бы вообще не стал использовать для ее решения ARM. AVR или мелкая логика будут смотреться куда как гармоничнее.
en0t
Цитата(aaarrr @ Mar 12 2008, 13:43) *
Почему?
smile.gif Да легко. Вот только прерываться с частотой 200KHz не советую, впрочем, хозяин - барин.

Для 48MHz MCK:
Код
void timer0_ini(void)
{
    AT91C_BASE_PMC->PMC_PCER = (0x01 << AT91C_ID_TC0);

    // Wave mode, MCK/8,  UP mode with automatic trigger on RC Compare
    AT91C_BASE_TCB->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV2_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE;
    AT91C_BASE_TCB->TCB_TC0.TC_RC = 29;
    AT91C_BASE_TCB->TCB_TC0.TC_CCR = AT91C_TC_CLKEN;
    AT91C_BASE_TCB->TCB_TC0.TC_IER = AT91C_TC_CPCS;
    AT91C_BASE_TCB->TCB_TC0.TC_CCR = AT91C_TC_SWTRG;

    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0x07;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (u_int)tc0_irq_handler;
}

Может кто подскажет как это правельно в iar подвезать
KAlex
Цитата(en0t @ Mar 12 2008, 14:56) *
Может кто подскажет как это правельно в iar подвезать

Из
AT91C_BASE_TCB->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV2_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE;
делаем
AT91C_BASE_TC0 -> TC_CMR = AT91C_TC_CLKS_TIMER_DIV2_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE;
и т.д.
Kirill Frolov
Цитата(en0t @ Mar 12 2008, 13:00) *
Есть микроконтролер AT91sam7s256
Задача: Получение прямоугольных импульсов от 1 Гц до 200 кГц с возможностью регулирования скважности.

Подскажите как проще сделать это.

Сам склоняюсь к использованию таймеров, но вот как оптимальней настроить и какие именно взять незнаю.

Кто знает подскажите, Зарание С П А С И Б О


С П А С И Б О не булькает. Его в стакан не нальёшь. И в карман не положишь.


Цитата(en0t @ Mar 12 2008, 13:32) *
не через ШИМ не получится т. к. в полученом сигнале пауза должна измерятся в микросекундах и соответственно изменятся тоже в них.


Ассемблер с подчётом программы по тактам никто не отменял.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.