54 сообщения в этой теме

nightt    0

Здравствуйте!

Подскажите, пожалуйста, вот я на ATtiny13 пытаюсь освоить ШИМ.

Регистры:

управления - TCCR0B, TCCR0A

таймер - TCNT0

совпадения - OCR0A, OCR0B

Частота МК 1Мгц.

На какой максимальной частоте может работать ШИМ и как выставлять частоту в зависимости от той, которая мне нужна? И как плавно ее менять? Кнопкой или програмно.

Мы можем с помощью разрядов CSn0, CSn1, CSn2, тактового делителя регистра TCCRn, выставить разные частоты CLK/8, CLK/32, CLK/64, CLK/128, CLK/256 и CLK/1024. А как выставить частоту, если она нужна мне произвольная? Которую не возможно выставить с помощью CLK/8, ... ?

ДШ у меня на английском. Я не разберусь все не как.

Подскажите, пожалуйста.

Курс AVR123 читал. Не понял. Задача 8.

Пишу в CodeVisionAVR.

Изменено пользователем nightt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Migray    5

Попробуй объяснить исходную задачу подробней.

Не совсем понятно, вернее совсем не понятно, зачем менять частоту ШИМ?

Потом проблемы с фильтрацией будут.

Может тебе надо менять частоту сигнала, который ты с помощью ШИМ формируешь?

Изменено пользователем Migray

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0
зачем менять частоту ШИМ?

Я хочу сделать сирену на Шим сигнале. Чтоб вначале была низкой, а потом увеличивалась до невыносимого писка. Вот и незнаю, как програмно менять частоту. Как програмно менять скважность, я знаю.

Для изменения частоты шим есть такая формула:

post-38584-1192186676.jpg

Но как ее использовать програмно, я незнаю. Подскажите кто знает, пожалуйста.

Кстати, написал програмку, которая помогает расчитать значения TCNT0 и TCCR0B которые необходимо выставлять для получения той или иной частоты таймера. Кому интересно, скачайте, и скажите мне, как она вам. Только для ATtiny13. Потому что в других контроллерах другое управление.

FrequencOutput.rar

Изменено пользователем nightt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Migray    5

Так загони ШИМ на максимально возможную частоту, и формируй любой нужный тебе сигнал.

Ты-же ШИМом можешь выдать любое напряжение, и менять его в течении времени, по синусоиде или еще как ...

Кстати на сирену ШИМ не обязателен, она вместо синусоиды и меандр схавает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0
Так загони ШИМ на максимально возможную частоту

В коде, как это сделать?

формируй любой нужный тебе сигнал

Напиши пожалуйста пример.

ШИМом можешь выдать любое напряжение, и менять его в течении времени

Как менять, в коде?

сирену ШИМ не обязателен, она вместо синусоиды и меандр схавает

Совершенно верно. У меня в динамике вместе с изменением скважности, слышен постоянный гул.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    157

Ты, наверное, не понимаешь как формируют звук из ШИМа.

Интеграл за период ШИМа это есть мгновенное значение синтезируемого сигнала. Т.е. сигналом является СКВАЖНОСТЬ, а не частота. А частота должна быть выше сигнала на столько, что бы не лезть через ФНЧ на выходе.

Смысл алгоритма прост. Меняешь дьюти_цикл по синусоиде и получаешь ее после ФНЧ.

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
YurkaM    7
Я хочу сделать сирену на Шим сигнале. Чтоб вначале была низкой, а потом увеличивалась до невыносимого писка. Вот и незнаю, как програмно менять частоту. Как програмно менять скважность, я знаю.

Если я правильно понял задачу, то тебе не нужен ШИМ, а вполне сойдет меандр с изменяемой частотой. Для этого можно использовать таймер в режиме CTC (сброс при совпадении), т.е. WGM02:WGM01:WGM00=101.

Режим выхода надо выставить в "переключение", т.е. COM0A1:COM0A0=01 (это в регистре TCCR0A)

Частоту будешь менять записывая рарзные значения в OCR0A. Регистры указаны для Т0. Можно то-же делать и на старшем таймере.

Частота считается по формуле

post-31916-1192258461_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0
меандр с изменяемой частотой. Для этого можно использовать таймер в режиме CTC (сброс при совпадении), т.е. WGM02:WGM01:WGM00=101.

Режим выхода надо выставить в "переключение", т.е. COM0A1:COM0A0=01 (это в регистре TCCR0A)

Частоту будешь менять записывая рарзные значения в OCR0A

Делаю:

#include <delay.h>

PORTB=0x00;

DDRB=0x02;//Pinb.1 out

TCCR0A=0x41;//COM0A0:WGM00 = 11

TCCR0B=0x08;//WGM02 = 1

while (1)

{

// Place your code here

OCR0A++;//новое значение частоты

if(OCR0A == 255)

OCR0A = 0;

delay_ms(100);

};

В динамике вообще даже стука нет :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
HOT ICE    2
меандр с изменяемой частотой. Для этого можно использовать таймер в режиме CTC (сброс при совпадении), т.е. WGM02:WGM01:WGM00=101.

Режим выхода надо выставить в "переключение", т.е. COM0A1:COM0A0=01 (это в регистре TCCR0A)

Частоту будешь менять записывая рарзные значения в OCR0A

Делаю:

#include <delay.h>

PORTB=0x00;

DDRB=0x02;//Pinb.1 out

TCCR0A=0x41;//COM0A0:WGM00 = 11

TCCR0B=0x08;//WGM02 = 1

while (1)

{

// Place your code here

OCR0A++;//новое значение частоты

if(OCR0A == 255)

OCR0A = 0;

delay_ms(100);

};

В динамике вообще даже стука нет :(

Это наверно общая проблема всех новичков в том числе и меня)Кажется что пишем правильно,а на самом то деле(Нет

Мне кажется что тут OCR0A++;Значение меняется на столько быстро что ты этого не успеваеш даже заметить.

Тут скорей всего ещё переменную юзать нужно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0

Ок! Ответьте пожалуйста на один вопрос: Я МОГУ ПРОГРАМНО ИЗМЕНЯТЬ ЧАСТОТУ ПРОЦА, В УЖЕ РАБОТАЮЩЕЙ ПРОШИВКЕ? ДА ИЛИ НЕТ?

P.S. Как шимом вывести аналоговый сигнал? Например массив a[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    157
Ок! Ответьте пожалуйста на один вопрос: Я МОГУ ПРОГРАМНО ИЗМЕНЯТЬ ЧАСТОТУ ПРОЦА, В УЖЕ РАБОТАЮЩЕЙ ПРОШИВКЕ? ДА ИЛИ НЕТ?

P.S. Как шимом вывести аналоговый сигнал? Например массив a[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10?

В ПИКах - можно, изменяя регистр калибровки... В АВРах - не в теме...

По второму вопросу уточнение. Я так понял нужно получить пилу? ШИМ используют для получения НЕПРЕРЫВНЫХ сигналов. А что делать с обозначенным вектором - зациклить или чего еще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0
В ПИКах - можно, изменяя регистр калибровки... В АВРах - не в теме...

В моем понятии, колибровка, это если у нас несколько индикаторов на одной линии, то оживить тот или иной индикатор, в момент времени, можно, подать сигнал колибровки, который отдельно подходит к тому или иному индикатору.

ПОЖАЛУЙСТА, пусть для PICов, оттобразите это (ПРОГРАМНО ИЗМЕНЯТЬ ЧАСТОТУ ПРОЦА, В УЖЕ РАБОТАЮЩЕЙ ПРОШИВКЕ) в коде, там буквально 2-3 строчки... :huh:

По второму вопросу уточнение. Я так понял нужно получить пилу? ШИМ используют для получения НЕПРЕРЫВНЫХ сигналов. А что делать с обозначенным вектором - зациклить или чего еще?

Сделай хоть как-нибудь, чтоб я оперся на что-нибудь вообще, а то плаваю как ... в проруби.

Если мне нужно вывести сигнал с пина, например, длительностью 10ms, а потом изменять длительность, как это сделать? Хотя бы в псевдокоде, с упоминанием необходимых регистров... :huh:

(Это наверно нужно делать, записывая значения в регистр сравнения? А как ко времени привязать?) :huh:

И еще, я напишу кое-что, вы прочитайте, и скажите, правильно или нет:

МК имеет генератор тактовой часоты.

Для выполнения нужного цикла действия, мы можем тактовую частоту сделать меньше.

Но только для этого действия; и она будет реально меньше.

Сама же тактовая частота (кварц проца) как работал по максимуму, так и будет работать, крутится, не имея сцепы с работой выполняемой МК.

МК имееет несколько таймеров (со всеми дополнительными приблудам: управления, совпадения, захват, сам таймер).

Таймеры могут быть 8 и 16 разрядными.

Можно заставить МК работать параллельно, то есть осуществлять параллельную деятельность, в зависимости от того, сколько таймеров задействовано. Каждое действие будет привязано к конкретному таймеру и к конкретному порту-пину. И все это описано в одной программе. Каждое параллельное действие не будет "ждать", пока исполнится пред ним идущее действие. Действие привязанное к конкретному таймеру, - самостоятельное.

Каждое действие может работать на своей частоте, раз уж оно привязано к отдельному таймеру.

Для получения конкретной частоты, нужно воспользоваться делителем и счетным регистром. В результате мы можем вывести на конкретный порт-пин импульсы с заданой частотой (число импульсов в секунду)

Делитель делит тактовую частоту на 8-, 16, 32-, 64-, 128-, 256-, 512-, 1024-.

Счетный регистр инициализируется значением, с которого нужно начинать счет.

Расчет частоты исходящего импульса производится по формуле:

нужная частота = начльная частотаМК/делитель/(счетный регистр - число начала счета)

Программно изменяя число начала счета, мы можем программно изменять частоту исходящго импульса

(число импульсов в секунду). Это изменение частоты ограничено счетным регистром 8 - 16 разрядным. Для программного изменения частоты, не вписывающегося в конкетный-задействованный счетный регистр, можно задействовать счетный регистр другого таймера, с другим делителем тактовой частоты. Как с самим таймером этого счетного регистра, так и без него.

ШИМ сигнал, единственно, что мы можем сделать с шимом, это изменять скважность. Записывая в OCR маленькое значение, получаем большую скважность, записываем большое значение, скважность маленькая.

А частоту подачи импульсов, как менять...? :huh:

ПОЖАЛУЙСТА, прочтите кто-нибудь знающий, и скажите, правильно или нет... :huh::huh::huh:

С позиции AVR и других МК

Изменено пользователем nightt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

А зачем тебе все-таки частоту менять? (нарисуй лучше, что ты хочешь получить в конце, так всем понятней станет)

ЗЫ: при изменении скважности у тя будет что-то похожее на это, в случае 2 скважность меньше... разве ты не этого добиваешься?? (см. рис)

post-20910-1193136518_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0

Ребят, я не создаю оружие массового поражения, не бойтесь. Я не работаю с СВЧ, так что не сварю себе мозгъ, не волнуйтесь. Я хочу освоить управление моторчиком. Так чтоб понять. Что там в нем происходит, ё моё.

Моторы делятся на две большие группы: работающие на постоянке и переменке.

Сейчас я тужусь над переменкой. Хочу видеть воочию, что будет при подаче разных частот, с разным шимом, колличеством шимов, разным напряжением.

Хочу написать прогу, которая все это сделает, в зависимости от сигналов управления. Для любого двигателя на переменке.

Ответьте Пожалуйста на вопросы :huh::huh::huh:

Я их специально так задал чтоб Вы могли кратенько ответить.

Пробегитесь по тексту, и где не так, скажите - нет. Иначе, - да. Где неточности, дополните парой предложений. Вопросы все общие! конкретики нет вобще! :huh::huh::huh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    157

Дааа!!! Много каши в голове... Попробуем разобраться. Но переделывать сказанное бессмысленно, поэтому изложу заново.

Итак. Менять тактовую частоту процессора можно только при использовании ВНУТРЕННЕГО генератора. С кварцевым это НЕВОЗМОЖНО.

Второе. Так никто не делает. Возможность изменения этой частоты сделана ИСКЛЮЧИТЕЛЬНО ДЛЯ КАЛИБРОВКИ относительно неточного внутреннего генератора.

Третье. Для формирования временных диаграмм в реальном масштабе времени служат следующие инструменты:

1. Таймеры с цифровыми компараторами.

2. Прерывания.

3. Опорные внутренние генераторы(в том числе системный).

4. Опорные внешние генераторы.

Четвертое. Формировать временную диаграмму на пустых командах программным способом - дурной тон.

Теперь с ШИМом. Я уже рассказывал, что для вывода переменных напряжений необходимо менять скважность ШИМа, а его частоту выбрать максимально выше верхней частоты ФОРМИРУЕМОГО сигнала и не менять в процессе работы, т.к. это всего лишь частота несущей и после ФНЧ она исчезнет(почти).

Перед написанием программы для МК необходимо начертить временную диаграмму на бумаге. Т.е. эпюры, к примеру, управления двигателем. Далее определить источник базовой частоты, из которой предделителями и таймером будет создаваться необходимая частота.

Прерывания позволяют произвести синхронизацию (временную привязку) формируемой диаграммы к внешним событиям (пуск, стоп, синхронное вращение, шаговый режим и т.п.)

Наконец о примере кода. Сегодня и сейчас не готов. Под руками нет готового. Постараюсь завтра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0

Ребят, еще такой вопрос, ATmega48 позволяет вывести 6 ШИМ сигналов, подтолкните, пожалуйста, хоть примерно, как это сделать, я чо-то не разберусь в даташите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
YurkaM    7

Ну всё как обычно... Есть три таймера 0, 1 и 2. У каждого по 2 регистра сравнения (у 1 двухбайтный) и по два выхода ШИМ: A и B у каждого. Итого 6 штук.

Настраиваешь режим в регистрах

TCCR0A и TCCR0B для Т0,

TCCR1A и TCCR1B для Т1,

TCCR2A и TCCR2B для Т2.

Собственно значение ШИМ пишешь в регистры

OCR0A и OCR0B

OCR1AH : OCR1AL (станший и младший байт) и OCR1BH : OCR1BL (старший и младший байт)

OCR2A и OCR2B

Сигнал снимаешь с выводов

OC0A (PD6) и OC0B (PD5)

OC1A (PB1) и OC1B (PB2)

OC2A (PB3) и OC2B (PD3)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0

Спасибо. Хоть прояснилось немного.

И еще хочу спросить, малость, извините, если надоел.

Вот мк работает на одном из таймеров, с определенной частотой.

Срабатывает прерывание.

Действия в прерывании на какой частоте работают?

Если мы не задействуем таймеры, на какой частоте работает мк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
alts    1

На какой установлен на той и работает.От встроенного или от внешнего - не важно.Важно то что частота тактирования таймера получается из тактовой частоты МК(ядра), а не наоборот! Т.е. работает таймер(ы) или нет - ядру все равно.Прерывания, точнее программные обработчики оных, выполняются на частоте ядра!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0
частота тактирования таймера получается из тактовой частоты МК

Так если мы не запустили таймеры, мк на какой частоте работает то?

В СodeVisionAvr, в мастере, стоит 1000000 на все модели. С этой частотой и работает?

Если поставим максимальную, например 16 000 000, то будет работать на максимальной?

А если поставим 8 897 501, то будет строго на ней работать7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
YurkaM    7

Какой кварц припаяешь к контроллеру, на той и будет работать (естественно в диапазоне допустимых). Ещё при программировании можно делитель на 8 включить (не у всех).

Изменено пользователем YurkaM

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0
Какой кварц припаяешь к контроллеру, на той и будет работать

А что-то дополнительно нужно устанавливать в регистрах? При подключении внешнего кварца?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
YurkaM    7

Надо. Только не в регистрах, а в битах конфигурации (Fuse Bits). Это делается программатором. Смотри Даташит на твой МК, раздел "System Clock and Clock Options" и раздел "Memory Programming / Fuse Bits".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
nightt    0

Значит, если я подключаю кварц, то автоматически внутренний генератор перестает функционировать и все работает на частоте кварца (таймеры, ШИМ и тд.). Так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    157
Значит, если я подключаю кварц, то автоматически внутренний генератор перестает функционировать и все работает на частоте кварца (таймеры, ШИМ и тд.). Так?

Конечно нет!!! Внутренняя коммутация генераторов производится с битов конфигурации (фьюзов). Как запрограммируешь - так и будет (и только так).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Вот ужэ что-что не "сойдет", то как раз LM358.
    • Класс!  Я бы лучше приклеил таймер к плате кверху пузом со стороны деталей, напаял обвязку и после наладки всё залил бы термоклеем или герметиком.
    • Так то это не схема......брррр..
    • Куплю все. В личку жду данные для оплаты.
    • Почитал и ужаснулся. Это большая и серьёзная тема и не всё так просто. Самое простое объяснение по вопросу. АКБ Li-ion, с контролером заряда и контроля напряжения- если банка хорошая будет идти на неё  до 4.2в , в зависимости от падения напряжения на самой банке, и от подаваемой мощности адаптера и только 10% от ёмкости АКБ при напряжении на банке 3.6-3.7 в, при 4.2 в потребление тока чуть выше- при не полном заряде. 4.2 в считается ускоренной зарядкой и пограничной для прекращения заряда для контроллера бат. Контроллеры бывают разные при слабом источнике работает стабилизатор  напряжения с ограничительным сопротивлением для падения напряжения на батарее при  полном заряде напряжение уравнивается ток не течёт. другой вариант зарядки это зарядка импульсами , пример: 3 секунды заряд, 1 секунда разряд и замер напряжения. контроллер отключается при падении напряжения до 3.2 в во избежании глубокого разряда бат. что не допустимо для Li-ion АКБ. Также при ускоренной зарядке от источника напряжения мощностью не ниже самой АКБ есть защита от перегрева. Контроллер находящийся в самом питаемом устройстве контролирует режим зарядки изменением напряжения от 4.2 в.до 3.6 в и может заряжать импульсами что даёт более качественную зарядку бат. Теоретически источник питания должен иметь ток равный или больше как в АКБ, напряжение ровно столько как указанно на самой АКБ. при такой зарядке можно узнать фактическую ёмкость батареи, умножив ток потребления на 10 ть Раньше АКБ были другие и без контроллеров (имею ввиду на радиотелефонах-(в простонародье мобильники и сотовые-такие уже изчезли)) Мобильные, сотовые телефоны это транковые радиостанции устанавливающиеся в автомобильном транспорте и работающие через спутниковую цифровую сеть с мощностью от 1-20 ватт. с возможностью переноски за ручку, по этому удобная связь под рукой Сейчас связь тоже транковая радиотелефонные трубки у всех а сами базы, (типа , что стоят в квартирах  и работают на МГТС) , поставили на высоких зданиях через каждые 500 метров.
    • Почему им лучше не паять?
    • @XP1 посмотрите внимательно, там должны быть заводские метки.