Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7362
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

А вот я и не врубаюсь, используется или нет? Похоже, что это спрятано внутрях ардуины. В коде есть только установка частоты ШИМ - 31250 Гц, путём установки делителя равного 1:

Код: Выделить всё

void set_motor_pwm_frequency(int frequency) {
  switch (frequency) {
    case PWM_31250_HZ:
      // Divide by 1. frequency = 31.25 kHz;
      bitClear(TCCR1B, CS11);
      bitSet(TCCR1B, CS10);
      break;
И analogWrite принимает аргумент от 0 до 255. Получается, что счетчик считает только до 255? Т.е. тактовая 8Мгц (хотя мне казалось, что кварц 16 МГц), делим на 256 - получаем частоту ШИМ 31250. Или всё же 16Мгц, а TOP установлен как 1FF, а analogWrite записывает со сдвигом? Т.е. замерить интервал невозможно, так как счетчик уже 10 раз переполнится между импульсами? А менять частоту ШИМ двигателей я не могу - мне нужно снять характеристики именно в таком режиме.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1922
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

В вашем случае измерение периода не должно быть очень точной функцией. (Однако это напр. не частотомер с разрешением 1 Hz на напр. 50 MHz).
Почему бы не использовать готовые функции Arduino? Напр. pin change interruption ISR и micros()? Изменение вверх: начало измерения время, изменение вниз: остановка, разница: время.
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4462
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

uldemir писал(а):Т.е. замерить интервал невозможно, так как счетчик уже 10 раз переполнится между импульсами? А менять частоту ШИМ двигателей я не могу - мне нужно снять характеристики именно в таком режиме.
У меня есть тахометр на tiny2313, у которого таймер 1 имеет такой же функционал как и у mega328.
СпойлерИзображение
Программа считает длительность входного сигнала с периодом p_pwm=8192 такта для работы ШД. Не вижу никаких противопоказаний для задания p_pwm=256 тактов и 2-х байтном накопительном счетчике.
Встал на лапы
Сообщения: 121
Зарегистрирован: Пт мар 19, 2021 08:58:45

Сообщение kote52 »

Друзья, имеется код для статус светодиода, и разные его режимы работы.

Код: Выделить всё

// Массив режимов работы светодиода
uint16_t modes[] = {
	0B0000000000000000, //Светодиод выключен (
	0B1111111111111111, //Горит постоянно 
	0B0000111100001111, //Мигание по 0.5 сек 
	0B0000000100000001, //Короткая вспышка раз в секунду 
	0B0000000000001001, //Две короткие вспышки раз в 2 секунды 
	0B0000000001001001, //Три короткие вспышки раз в 2 секунды
	0B0101010101010101 //Частые вспышки
};

int main(void){

     while(1){

		// Событие срабатывающее каждые 125 мс СТАТУС СВЕТОДИОД
		if( ( msec_cnt - ms_led_st ) > 125 || msec_cnt < ms_led_st ) {
			ms_led_st = msec_cnt;
			// Режим светодиода ищем по битовой маске
			if(blink_mode & 1<<(blink_loop&0x0F)) {
				PORTC |=(1<<LED_STATUS);  //ON светодиод;
			}else{
				PORTC &=~(1<<LED_STATUS); //OFF светодиод
			}
			blink_loop++;
		}
      }
}
Вопрос можно ли такое засунуть в прерывания настроенные на 1 милисекунду, и какими последствиями плоха такая затея?

Код: Выделить всё

ISR (TIMER0_OVF_vect)
{
       		// Событие срабатывающее каждые 125 мс СТАТУС СВЕТОДИОД
		if( ( msec_cnt - ms_led_st ) > 125 || msec_cnt < ms_led_st ) {
			ms_led_st = msec_cnt;
			// Режим светодиода ищем по битовой маске
			if(blink_mode & 1<<(blink_loop&0x0F)) {
				PORTC |=(1<<LED_STATUS);  //ON светодиод;
			}else{
				PORTC &=~(1<<LED_STATUS); //OFF светодиод
			}
			blink_loop++;
		}
}
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 19077
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

засунуть можно, только все твои битовые маски станут длиной 2000 бит, вместо 16 бит.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

Starichok51, зачем!?
kote52, Добавьте в прерывании доп.счетчик байтовый. что б изменение светодиодов и сдвиг маски выполнялись каждый 125й тик таймера.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 152
Зарегистрирован: Вт окт 11, 2022 13:45:06

Сообщение ciaas »

Привет. Понадобилось мне на AtTiny13 генерировать секунду. На внутреннем генераторе. Никак не могу посчитать как настроить таймер. Всё получается какие то дробные числа. 9,6МГц. Свободных регистров есть. Помогите пж настроить таймер. Для меги 8 всегда брал RC на 8 МГц и получал 1 мкС.
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

ciaas, ставите прескалер 64 (CS0[2:0] = 011) - получаете на вход таймера 9600 кГц / 64 = 150 кГц
Далее, таймер в СТС (WGM0[2:0 = 010) TOP <- OCR0A
В регистр OCR0A пишете 150-1 - получаете тик таймера 1 мс
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Нашел транзистор. Понюхал.
Сообщения: 152
Зарегистрирован: Вт окт 11, 2022 13:45:06

Сообщение ciaas »

Ну блин просто же. Тупею :) спс
akl
Друг Кота
Сообщения: 4462
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Все равно должен быть счетчик 1мс до секунды. Можно тогда и так
9600000/256=37500
Зарядить счетчик на подсчет числа переполнений.
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

akl, счетчик миллисекунд до секунды в любом случае программный.
а вот 37500 уже нацело на 1000 не делится, поэтому не будет сработки каждую миллисекунду.
Если стоит задача считать секунду - то да, можно. Если стоит задача иметь миллисекундный таймер - то нет.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Модератор
Аватара пользователя
Сообщения: 19077
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Just_Fluffy, не обязательно делить на 256, у таймера можно применить режим СТС.
для получения 1мс нужно разделить на 9600. 9600 = 128 * 75.
таймером делим на 128, потом программным счетчиком делим на 75 и получаем 1 мс.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

Starichok51, тут речь о прескалере. И о том, что б получить период счета 1мс аппаратно, без досчитывания программным счетчиком.
Тиня мелкая, там всего 512 команд влазит.
И если аппаратно можно что то сделать, то лучше аппаратно, нежели программно.

Прескалер может быть 1, 8, 64, 256, 1024
таймер 8 бит.
Делитель на 9600 можно сделать так:
Fcpu/1 -> таймером разделить на 9600 - не подходит, таймер может максимум на 256 делить
Fcpu/8 -> таймером разделить на 1200 - не подходит, таймер может максимум на 256 делить
Fcpu/64 -> таймером разделить на 150 - подходит
Fcpu/256 -> таймером разделить на 37,5 - не подходит, таймер не может делить на дробное число. Но если достаточен период счета 2 мс - то подходит
Fcpu/1024 -> таймером разделить на 9,375 - не подходит, таймер не может делить на дробное число. Но если достаточен период счета 8 мс - то подходит

Резюмируя: Получить 1 мс без программных счетчиков можно, разделив тактовую 9,6Мгц прескалером на 64 и установив коэффициент 150 пересчета счетчика (СТС).

Кстати, если нужно считать секундные импульсы, то есть смысл взять прескалер 1024, коэфф. пересчета счетчика 75 - тогда получим период счета 8 мс. Или 125 тиков таймера в секунду, т.е. можно обойтись однобайтовым счетчиком.
Если же нужны интервалы по 1 мс - то счетчик миллисекунд уже будет двухбайтовый, что бы насчитать от 0 до 999.

Хотя тут все зависит от постановки задачи - что из временнЫх интервалов нужно ciaas.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Модератор
Аватара пользователя
Сообщения: 19077
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Just_Fluffy писал(а):Fcpu/64 -> таймером разделить на 150 - подходит
можно и так.
я просто привел один вариант, и не исследовал множество вариантов.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4462
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Задано было [uquote="ciaas",url="/forum/viewtopic.php?p=4482642#p4482642"]... Понадобилось мне на AtTiny13 генерировать секунду...[/uquote] почему то превратившиеся в 1мс. Без программных счетчиков сгенерировать секунду нельзя. :)
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

akl, тогда прескалер/1024 -> CTC /75 -> программно /125
1024*75*125=9 600 000
Накладные расходы - 125 прерываний в секунду, 1 байтовый счетчик.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
OKF
Это не хвост, это антенна
Сообщения: 1430
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="akl",url="/forum/viewtopic.php?p=4484233#p4484233"]Без программных счетчиков сгенерировать секунду нельзя. :)[/uquote]
Если сильно захотеть, то можно всё.)
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

OKF, Как? Если тиня тактируется от 9.6 МГц?

Кстати, в тиньке есть еще один "таймер" - прерывание АЦП - В непрерывном режиме АЦП будет дергать прерывание каждые 13 тактов.
Тактирование АЦП идет через делитель 2, 4, 8, 16 32, 64 или 128.
Соответственно, имеем 7 фиксированных делителей - от 2*13 до 128*13
9600 / (2*13) = 369,2 кГц
9600 / (128*13) = 5,77 кГц
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
OKF
Это не хвост, это антенна
Сообщения: 1430
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4484379#p4484379"]OKF, Как? Если тиня тактируется от 9.6 МГц?[/uquote]Да мало ли в Бразилии донов Пэдров тини13 делителей! И всяких там оскалов капитализма.)
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

OKF, в то м то и дело, что мало. максимум на 1024 можно поделить тактовую.
Оскалом тактовую можно занизить в 2 раза (в теории).
Но даже 4800000 Гц / (1024*256) - это 18.3 Гц
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Ответить

Вернуться в «AVR»