АЦП и ШИМ

AVR версия программы

Re: АЦП и ШИМ

Сообщение mim (mim) » 28 авг 2012, 10:46

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

А ничего сверх естественного и не требуется...достаточно было одной строчки (как говорит известный герой:"Достаточно одной таблэтки").
igr83 писал(а):Только странная штука опять... до этого я все прописывал в бинарном формате и у меня все заработало, сейчас когда я поппытался все прописать через смещение и не стал прописывать регистры в которых мы ничего не меняем ФК стал выдавать ошибку в "С" коде при компиляции.

Я думаю что на данном этапе это не актуально, если после всего прошедшего этот вопрос будет тебя мучить, то мы рассмотрим его отдельно (но думаю что он отпадет сам собой).

Ну а теперь, как говорится на "злобу дня"...
Вот тебе еще анекдот.
Стоят на холме два быка — старый и молодой. Мимо, под холмом, проходит стадо коров. Молодой бык суетится, пихает старого под бок: "Ну давай, ну давай быстренько, быстренько сбежим с холма и вот ту, молоденькую ..., или вон ту, стройненькую, или вон ту .... Ну давай, быстренько...".
Старый бык долго слушает, качает головой, потом говорит: "Нет и нет.., мы медленно, не спеша спустимся с холма и накроем все стадо....".


Теперь к телу.
1. В Протеусе и в программе частота кварцев должна совпадать. Многие потом жалуются на неадекватность процессов.
2. В программе все удали и создай макрос с именем, например, "PWM_1_Init".
3. В макросе напиши на Си - установка режима ШИМ - PWM, Phase Correct на 8-бит, на 9-бит и на 10-бит. Это три строчки.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе

Re: АЦП и ШИМ

Сообщение igr83 (Игорь) » 29 авг 2012, 06:05

Вопрос - ведь один счетчик может работать только в 1 режиме, или задать 3 разных счетчика в 3 разных режимах? (Просто в прошлый раз речь шла о работе только с таймером 1).
Ник: igr83
Имя: Игорь
(Омск)
Заинтересованный
Заинтересованный
Информация о пользователе

Re: АЦП и ШИМ

Сообщение mim (mim) » 29 авг 2012, 06:49

igr83 писал(а):Вопрос - ведь один счетчик может работать только в 1 режиме, или задать 3 разных счетчика в 3 разных режимах? (Просто в прошлый раз речь шла о работе только с таймером 1).

Да, один счетчик работает только в одном режиме, но три написанные строчки не обязывают его задумываться над тем что написал программист...
Просто напиши три строчки. Ты дальше все поймешь. У меня просто нет времени все описать сразу, я описываю по ходу.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение igr83 (Игорь) » 29 авг 2012, 08:28

Вроде так...
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: igr83
Имя: Игорь
(Омск)
Заинтересованный
Заинтересованный
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение mim (mim) » 29 авг 2012, 09:35

Что-то я не ожидал что так все пойдет... я все представлял по другому. Когда масла много это тоже не хорошо.
Вопрос-то звучал так
режим PWM, Phase Correct на 8-бит.
режим PWM, Phase Correct на 9-бит.
режим PWM, Phase Correct на 10-бит.

В итоге должно было быть так
TCCR1A|=(1<<WGM10);
TCCR1A|=(1<<WGM11);
TCCR1A|=(1<<WGM11)|(1<<WGM10);

Делов то??? Лишнее нам сейчас не нужно. Я думаю ты потом оценишь всю конструкцию. Она позволит все уложить в голове очень стройно.
Немного ликбеза по работе с битами (я вижу что ты это знаешь, но хочу сравнять уровень).
Все определения работы с битами находятся в файле <avr/sfr_defs.h>.
Например bit_is_set(TCCR1A,WGM11), bit_is_clear(TCCR1A, WGM11) , TCCR1A |= _BV(WGM11); TCCR1A &= ~_BV(WGM11); или TCCR1A |= _BV(2), bit_is_set(TCCR1A,2) все это одно и тоже.
Есть дополнительные определения типа set_bit(TCCR1A,WGM11); clear_bit(TCCR1A,WGM10); - в файле Матриксов bit_cmds.h
Таким образом
TCCR1А=255; // установить все единицы
TCCR1А=0; // очистить регистр
TCCR1А |= 1<<WGM10; // установить в единицу бит WGM10
TCCR1А |= 1<<1; // установить в единицу бит WGM10
TCCR1А = 1<<WGM10; // установить в единицу бит WGM10, но перед установкой весь регистр будет очищен это нужно понимать.
TCCR1B |= 0<<WGM10;// не правильно, ничего не произойдет
TCCR1B &= ~(1<<WGM10);// установить в ноль бит WGM10
Можно применять различные конструкции, главное понимать что будет происходить. Иногда удобней писать set_bit или clear_bit.
Теперь мы говорим на одном языке.
Я предлагаю дописать тебе макрос PWM_1_Init дополнительными условиями. Для этого ввести новую переменную (параметр), например, bitRes передавая через нее значения 8, 9 или 10 в функцию в ней будет выбираться один из режимов.
После этого ты получишь весь бонус.. :mad:
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение igr83 (Игорь) » 30 авг 2012, 10:14

Ну вот, вроде получилось... Я опять попытался сразу кое что добавить - так сказать для самопроверки попытался вывести индикацию состояния регистра TCCR1A, но почемуто она работает только в одну сторону, а при обнулении почемуто не гаснет :-(
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: igr83
Имя: Игорь
(Омск)
Заинтересованный
Заинтересованный
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение mim (mim) » 30 авг 2012, 10:57

igr83 писал(а):Ну вот, вроде получилось... Я опять попытался сразу кое что добавить (

Без комментариев... :x

Видать до бонуса еще рано…
Это потому что ты перестал читать то, что я пишу.
1. Кварц не изменил.
2. Занялся самодеятельностью (причем она показала полное непонимание процесса).
3. Макрос PWM_1_Init должен содержать только то, что было сказано.
4. Макрос PWM_1_Init должен иметь входной параметр – это переменная, через которую передаются значения в Макрос (функцию) – это локальная переменная – читай Хелп (или ищи на форуме).
5. Макрос PWM_1_Init потому так и называется «Init», что не должен крутится в цикле (хотя можно так применять если ты знаешь для чего, а ты видать не знаешь, это будет дальше).
6. Подсказка
Код: выделить все
if(FCL_BITRES == 9)         
   {       // 9bit mode                 
   set_bit(TCCR1A,WGM11);                 
   clear_bit(TCCR1A,WGM10);
   }       
else    if( FCL_BITRES == 10 )         
      {       // 10bit mode                 
      set_bit(TCCR1A,WGM11);                 
      set_bit(TCCR1A,WGM10);         
      }         
      else         
      {       // default 8bit mode                 
      clear_bit(TCCR1A,WGM11);                 
      set_bit(TCCR1A,WGM10);
               }   


Пробуй еще...
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение igr83 (Игорь) » 31 авг 2012, 03:54

Работа над ошибками.
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: igr83
Имя: Игорь
(Омск)
Заинтересованный
Заинтересованный
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение mim (mim) » 31 авг 2012, 07:32

Как говорил известный герой: "Хороший мальчик..."
Даже и не знаю, кто заработал бонус, я или ты?...

Подведем итоги.
Созданы следующие функции в макросах.
1. Установка частоты ШИМ (вариант 1) - установка верхнего предела ШИМ (8,9,10 бит) и точности F и фазы ШИМ. (макрос PWM_1_Init)
Устанавливается в регистрах TCCR1А и TCCR1B:
- биты WGMn1, WGMn0 – установка верхнего предела ШИМ
- биты WGMn2 – точность ШИМ.
2. Установка частоты ШИМ (вариант 2) - установка верхнего предела ШИМ (до 16 бит) и точности F и фазы ШИМ. (макрос PWM_1_Init_ICR)
Устанавливается в регистрах TCCR1А и TCCR1B:
- биты WGMn2, WGMn1, WGMn0 – установка верхнего предела ШИМ по регистру ICRn
- биты WGMn3 – точность ШИМ.
3. Установка Предделителя (частоты тактирования, косвенно частоты ШИМ). (макрос SetPrescale_1)
Устанавливается в регистре TCCR1B:
- биты CSn2,CSn1,CSn0.
4. Установка скважности ШИМ (OCRnХ). (макросы PWM_1_ASet, PWM_1_BSet, PWM_1_CSet)
Устанавливается в регистрах OCRnA, OCRnB, OCRnC соответственно.
Значение установок не должны превышать верхний предел.
5. Установка режимов портов OCnХ. (макросы PWM_1_AOn, PWM_1_BOn, PWM_1_COn)
Устанавливается в регистре TCCR1:
- биты COMnA1, COMnA0, COMnB1, COMnB0, COMnC1, COMnC0 соответственно для портов OCnA/OCnB/OCnC.
Дополнительно созданы макросы отключения ШИМ (общий PWM_1_Off, по каналам PWM_1_AOff, PWM_1_BOff, PWM_1_COff).

В макрос PWM_1_Init дополнительно ввели еще один параметр – FAST для управления типом ШИМ.
Есть небольшая особенность этого решения, вот ее описание.
Например, мы хотим установить 1 или 0 в бите WGM12. Это можно сделать так
Код: выделить все
if (FCL_FAST)
{TCCR1B |= 1<<WGM12;} // установить единицу
else
{TCCR1B &= ~(1<<WGM12;} //установить ноль

переменная FCL_FAST принимает значение 0 или 1.
Этот код можно упростить до следующего.

Код: выделить все
TCCR1B = FCL_FAST<<WGM12;


Если этот код рассматривать в отрыве от того места, где он размещен, то можно сказать, что написана бессмыслица. Потому что если пользоваться классической записью, то для установки бита строка должна выглядеть как
Код: выделить все
TCCR1B |= (FCL_FAST <<WGM12);

или
Код: выделить все
TCCR1B &= ~(FCL_FAST <<WGM12);

Поэтому первый код и написан с применением оператора if else.
Но если этот код мы размещаем самым первым (в начале инициализации) и понимаем, что в этот момент нас не волнует что было записано в регистре TCCR1B, то строка TCCR1B = FCL_FAST<<WGM12; обнулит регистр TCCR1B, не взирая на то чему равна переменная FCL_FAST, и если она равна единице, то дополнительно в бит WGM12 будет записана единица. Если в регистре TCCR1B были установлены какие-то биты, то после этого в нем будет только один бит WGM12.
Так что нужно понимать конструкции вида TCCR1B =, TCCR1B |=, TCCR1B &=.
Они эквивалентны TCCR1B = var, TCCR1B = TCCR1B | var, TCCR1B =. TCCR1B & var.
Дополнительно изучи побитовые операции, поразрядные операции, битовые маски.

PWM_mega128_Forum.rar

В архиве лежат файлы работы с таймером 0(2) и таймером 1(3). В программах просто набросаны кубики для примера (без особого смысла) Файлы для расчета частоты, периода скважности и выбора режимов (основных).
Кроме того, в архиве есть файл AVR_Custom.c, скопируй его на место старого. Создай новую программу и положи на стол компонент Custom. Открой компонент и через импорт подгрузи файл PWM_t1.fcc (он тоже в архиве). Как добавит и создавать свои макросы в Custom можно прочесть на форуме. Для таймера 3 нужно поменять в регистрах единичку на тройку (для управления ШИМ в некоторых других МК смори имена регистров смотри в ДАТЕ).

Вот теперь ты можешь проводить все эксперименты по исследованию режимов (есть на что посмотреть) :!).
У вас нет доступа для просмотра вложений в этом сообщении.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: АЦП и ШИМ

Сообщение igr83 (Игорь) » 31 авг 2012, 08:23

Огромное спасибо, mim, за потраченное на меня время!
Ник: igr83
Имя: Игорь
(Омск)
Заинтересованный
Заинтересованный
Информация о пользователе
Вернуться наверх

Пред.След.

Вернуться в Flowcode AVR

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей