Форум РадиоКот • Просмотр темы - Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Сообщения без ответов | Активные темы
Страница 5 из 6
[ Сообщений: 114 ]
, , , , ,
Автор
Сообщение
slav0n
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Чт сен 30, 2021 11:12:15
Опытный кот
Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15Сообщений: 882Откуда: Харьков
Рейтинг сообщения: 0
правильное деление на 256 делается через union
Код:
union {u16 i; u8 c[2];} pw; pw.i = pid->fout * MAXPULSEDURATION; pid->pwrOutput = pw.c[1];
_________________ ohmycode! primuss3.com
Вернуться наверх
Реклама
Dimon456
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Чт сен 30, 2021 13:55:03
Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54Сообщений: 1849
Рейтинг сообщения: 0
Вы так долго будете делить, пока ТС не скажет какой ему диапазон частот нужен.
Спойлер К примеру: нужен диапазон частот от 2кГц и до 5кГц Имеем вводные данные:Код:
При тактовой частоте 1МГц, ICR1H=0 ICR1L=250 2000Гц При тактовой частоте 1МГц, ICR1H=0 ICR1L=100 5000Гц
Самый простой вариант, использовать уравнение прямой проходящей через две точки:Код:
АЦП=0 соответствует ICR1L=250 2000Гц АЦП=255 соответствует ICR1L=100 5000Гц
воспользуемся онлайн калькулятором, допустим этим получаем формулу Код:
y=−0.5882352941176471x+250
Встраиваем ее в наш кодКод:
period_temp2 = (uint16_t) ((int32_t) ((int32_t)period_temp * (-0.5882352941176471)) + 250); pulsewidth_temp2 = (uint16_t) ((uint32_t) ((uint32_t)pulsewidth_temp * (uint32_t)period_temp2)/256);
в протеусе моделируется ровно от 2000Гц до 5000Гц А вот теперь делите, как хотите, хоть через союз union.
Вернуться наверх
Реклама
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Чт сен 30, 2021 16:50:37
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Starichok51 писал(а):
режим №8 работает "туда и обратно". когда ICR1 равно 256, количество тиков равно 512.
Точно! Максимальный период в режиме 8 равен 131 070. Упустил этот момент.
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вс окт 03, 2021 21:09:59
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Dimon456 , спасибо за код.
Хотел спросить...
Зачем делать так?:
Код:
period_temp2 = (uint16_t) ((uint32_t) ((uint32_t)period_temp * 0x10000)/256);
Если можно сделать так:
Код:
period_temp2 = (uint16_t)period_temp * (0x10000/256);
Дополнительные преобразования типов наверняка отнимают время?
Вернуться наверх
Реклама
Starichok51
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вс окт 03, 2021 22:56:03
Модератор
Карма: 153
Рейтинг сообщений: 2927
Зарегистрирован: Сб авг 14, 2010 15:05:51Сообщений: 18929Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
умножение на 0х10000 (65536) и последующее деление на 256 эквивалентно одному умножению на 256. так что, можно упростить выражение для периода.Добавлено after 2 minutes 49 seconds: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ. и первые переменные лучше объявить uint8_t period_temp, pulsewidth_temp; так как в них сохраняется один байт из ADCH.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вернуться наверх
Реклама
Dimon456
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вс окт 03, 2021 23:10:52
Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54Сообщений: 1849
Рейтинг сообщения: 0
Kalisnik писал(а):
Дополнительные преобразования типов наверняка отнимают время?
0x10000 и 256 красивые числа, компилятор наверняка их сократит.
При 0x10000 вы не сможете перекрыть полностью диапазон. По этому у меня было три диапазона: 0x10000 0x1000 и 0x100.
Вернуться наверх
Реклама
Starichok51
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вс окт 03, 2021 23:46:36
Модератор
Карма: 153
Рейтинг сообщений: 2927
Зарегистрирован: Сб авг 14, 2010 15:05:51Сообщений: 18929Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
ну, ТС нам так и не сообщил, какой диапазон ему нужен. видимо, нужен как раз тот, какой у него в исходнике.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вернуться наверх
slav0n
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Пн окт 04, 2021 10:17:46
Опытный кот
Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15Сообщений: 882Откуда: Харьков
Рейтинг сообщения: 0
Dimon456 писал(а):
0x10000 и 256 красивые числа
так и писал бы тогда их красиво: 0x10000 и 0x100
сразу была бы понятна твоя бессмыслица:
Dimon456 писал(а):
у меня было три диапазона: 0x10000 0x1000 и 0x100
_________________ ohmycode! primuss3.com
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Пн окт 04, 2021 10:51:27
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Попробовал режим №9 Т1. Работает без всяких костылей. Кода на порядок меньше. OCR1A задает период, а OCR1B скважность.
Вернуться наверх
Реклама
Starichok51
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Пн окт 04, 2021 11:53:57
Модератор
Карма: 153
Рейтинг сообщений: 2927
Зарегистрирован: Сб авг 14, 2010 15:05:51Сообщений: 18929Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
на порядок - это в 10 раз. не вижу, где у тебя могло сократиться в 10 раз.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Пн окт 04, 2021 17:05:53
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Starichok51 , хороший подкол
Вернуться наверх
Starichok51
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Пн окт 04, 2021 19:51:51
Модератор
Карма: 153
Рейтинг сообщений: 2927
Зарегистрирован: Сб авг 14, 2010 15:05:51Сообщений: 18929Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
я вообще не вижу, чтобы было сокращение кода. нет никакой разницы, в какие регистры записывать период и длительность.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 10:06:20
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Не нужно прописывать буферизацию для ICR1 руками. В этом весь прикол.Добавлено after 5 minutes 22 seconds: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ. В дадашите рекомендуют при часто меняющейся частоте использовать регистр OCR1A для задания верхнего предела таймера.
Вернуться наверх
slav0n
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 14:45:32
Опытный кот
Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15Сообщений: 882Откуда: Харьков
Рейтинг сообщения: 0
Kalisnik писал(а):
В дадашите рекомендуют при часто меняющейся частоте
опять ТС решает задачу через ж
_________________ ohmycode! primuss3.com
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 16:19:21
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Почему в этом примере вместо ожидаемого результата 19 349, получается 150?
Код:
volatile uint8_t period = 214; OCR1A = (uint16_t)(((period * 257)/4) + 5600);
Добавлено after 20 minutes 52 seconds: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ. slav0n писал(а):
решает задачу через ж
Голос за кадром...
Вернуться наверх
slav0n
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 16:30:01
Опытный кот
Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15Сообщений: 882Откуда: Харьков
Рейтинг сообщения: 0
Kalisnik писал(а):
Почему в этом примере вместо ожидаемого результата 19 349, получается 150?
патамушо написано через ж
_________________ ohmycode! primuss3.com
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 16:33:11
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Кроме комментариев мы ни чего не увидим..
Последний раз редактировалось Kalisnik Вт окт 05, 2021 16:35:45, всего редактировалось 1 раз.
Вернуться наверх
Dimon456
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 16:34:42
Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54Сообщений: 1849
Рейтинг сообщения: 0
Kalisnik писал(а):
Почему в этом примере вместо ожидаемого результата 19 349, получается 150?
А за чем нам еще нужно приведение типов?
Даже и не охота и объяснять
Код:
OCR1A = (uint16_t)((((uint32_t)period * 257)/4) + 5600);
Вернуться наверх
slav0n
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 16:38:54
Опытный кот
Карма: -14
Рейтинг сообщений: -98
Зарегистрирован: Ср дек 01, 2010 00:38:15Сообщений: 882Откуда: Харьков
Рейтинг сообщения: 0
Код:
OCR1A = period * 257UL / 4 + 5600;
_________________ ohmycode! primuss3.com
Вернуться наверх
Kalisnik
Заголовок сообщения: Re: Atmega8, ШИМ - низкий уровень на выводе после остановки
Добавлено: Вт окт 05, 2021 16:43:52
Зарегистрирован: Вс апр 18, 2021 15:43:55Сообщений: 430
Рейтинг сообщения: 0
Dimon456 , точно! Ну или float нужно было написать. Рано или поздно, после долгого ковыряния с кодом начинает клинить... ))) Спасибо!
Вернуться наверх
Страница 5 из 6
[ Сообщений: 114 ]
, , , , ,
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения