|
ШИМ 100 кГц, help, ШИМ 100 кГц |
|
|
|
Jun 2 2008, 16:03
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Такая проблема: есть микроконтроллер, скажем ATmega8535, есть кварц, пусть 12 МГц, использовать таймер-счетчик будем в режиме счета до максимального числа и обратно. Так вот в чем проблема, в таком режиме таймер-счетчик можно использовать минимум как 8-битный. мне нужно получить частоту ШИМ = 100 кГц, соответственно, если не используем предделитель частоты получаемчастоту ШИМ=12 МГц/510, где 510-кол-во счета таймера Мне нужно чтоб частота ШИМ равнялась 100 кГц, так вот, если испоьзовать такой счетчик, то кристал должен работать на частоте 12 МГц*510=многова то будет Спецы, как можно исправить проблему, в принципе, можно заставить таймер считать от 0...61 и от 60 ...1 Уважаемые, помогите настроить таймер, чтоб так считал, вот мой кусок прграммы: таймер все равно считает до 255 и обратно, где ошибка? Start: ldi R16, low(RAMEND) out SPL, R16 ldi R16, high(RAMEND) out SPH, R16 clr R16 out ICR1H, R16 ldi R16, 60 ; ICR1 = 60 - "потолок" счетчика out ICR1L, R16 clr R16 ldi R16, 160 ; ICR1 = 60 - "потолок" счетчика out TCNT1L, R16 ; в OCR1A и(или) OCR1B можно занести коэффициент заполнения ШИМ ; предварительно настроив режим выхода OC1A и OC1B ldi R16, (1<<WGM11) out TCCR1A, R16 ldi R16, (1<<WGM13)+(1<<CS10); счетчик работает на тактовой частоте без деления out TCCR1B, R16 rjmp PC ; просто бесконечный цикл
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 2 2008, 17:45
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Цитата(domowoj @ Jun 2 2008, 20:39)  ICR1 - регистр захвата, информация в котором защелкивается по сигналу ICP.
В смысле? как это организовать?
Для ШИМ нужно исп. OCR. -это понятно
|
|
|
|
|
Jun 2 2008, 17:58
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(САНЯ100 @ Jun 2 2008, 19:03)  должен работать на частоте 12 МГц*510=многова то будет Почему 12M * 510? вообще-то 100kHz * 510. Но и это многовато. Цитата Мне нужно чтоб частота ШИМ равнялась 100 кГц Выход - использовать другие режимы ШИМ. 0->OСRxB (где таймер будет считать не до 0xFF, а до OCRxB).
|
|
|
|
|
Jun 2 2008, 19:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(САНЯ100 @ Jun 2 2008, 20:03)  Код ldi R16, 60 ; ICR1 = 60 - "потолок" счетчика out ICR1L, R16 clr R16 ldi R16, 160 ; ICR1 = 60 - "потолок" счетчика rjmp PC ; просто бесконечный цикл Вы с цифрами ничего не напутали 510=$1FE Значит младший байт $FE , старший $01 а 160 = $A0 - 60= $3С
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jun 2 2008, 19:32
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Выход - использовать другие режимы ШИМ. 0->OСRxB (где таймер будет считать не до 0xFF, а до OCRxB). [/quote]
Друг, подскажи как это программно реализовать
|
|
|
|
|
Jun 2 2008, 22:19
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(САНЯ100 @ Jun 2 2008, 22:32)  Друг, подскажи как это программно реализовать Сорри, я чего-то подумал на другой чип. Для m8535 все верно. Вот убрал лишнее и проверил CODE clr R16 out ICR1H, R16 ; ldi R16, 60 ; ICR1 = 60 - "потолок" счетчика out ICR1L, R16 ; ; в OCR1A и(или) OCR1B можно занести коэффициент заполнения ШИМ ; предварительно настроив режим выхода OC1A и OC1B ldi R16, (1<<WGM11) // | (1 << WGM10) out TCCR1A, R16 ldi R16, (1<<WGM13) | (1<<CS10); счетчик работает на тактовой частоте без деления out TCCR1B, R16
rjmp PC ; просто бесконечный цикл
Если смотреть симулятором, то там баг - действительно крутит до 512. А в железе этот же код (смотреть через JTAG, на m16) работает как надо - до 60-ти и обратно.
|
|
|
|
|
Jun 3 2008, 04:59
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Цитата(defunct @ Jun 3 2008, 02:19)  Сорри, я чего-то подумал на другой чип. Для m8535 все верно. Вот убрал лишнее и проверил CODE clr R16 out ICR1H, R16 ; ldi R16, 60 ; ICR1 = 60 - "потолок" счетчика out ICR1L, R16 ; ; в OCR1A и(или) OCR1B можно занести коэффициент заполнения ШИМ ; предварительно настроив режим выхода OC1A и OC1B ldi R16, (1<<WGM11) // | (1 << WGM10) out TCCR1A, R16 ldi R16, (1<<WGM13) | (1<<CS10); счетчик работает на тактовой частоте без деления out TCCR1B, R16
rjmp PC ; просто бесконечный цикл
Если смотреть симулятором, то там баг - действительно крутит до 512. А в железе этот же код (смотреть через JTAG, на m16) работает как надо - до 60-ти и обратно. Нда, и как же быть? может действительно чего не хватает? ведь по идее он во время отладки тоже должен считать до 60 и обратно  Цитата(domowoj @ Jun 3 2008, 05:51)  Тоже не разглядел про ICR1. Но в этом реж. в него ( ICR1) коэф. счета нужно заносить число 30, а не 60. Т.е. дискретность ШИМ при 100кГц будет период/30.
при частоте 12 МГц чтобы частота ШИМ получилась 100 Кгц надо чтоб счетчик считал кол-во импульсов=120, в принципе все равно в каком режиме получить ШИМ
САНЯ100 а зачем вам считать в обе стороны, может подойдет реж. fast PWM, дискретность удвоится. можно и так- не получается
|
|
|
|
|
Jun 3 2008, 05:07
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Т.е. в программе все нормально?! добавить еще значения переключения на выводах (короче сделать ШИМ) - И ВСЕ ДОЛЖНО РАБОТАТЬ?
|
|
|
|
|
Jun 3 2008, 11:41
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Цитата(_Pasha @ Jun 3 2008, 09:16)  ... если добавить настройку соответствующей линии порта на выход и загнать в TCCR1A правильные настройки COM1xx - инвертированный шим или неинвертированный Вот я и хочу понять как правильно сделать настройки
|
|
|
|
|
Jun 3 2008, 13:48
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 2-06-08
Пользователь №: 37 994

|
Ребята, кто нито может привести кусок программы, где таймер-счетчик считает не до $ff? а ,скажем до 100 и обратно, или хотя бы просто до 100 и сброс в ноль
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|