Дипломная работа: Разработка солнечных часов

S1-S3 – кнопки управления и регулировки.

2.5 Разработка алгоритма управления

Блок-схема алгоритма, управления двигателем солнечных часов представлена на рисунке 2.7.

Согласно блок схеме, в начале программы выполняется установка состояния портов, а также указывается вектор прерывания, который имеет две ветви:

• вектор RESET переходит при сбросе программы в начальное состояние;

• вектор INTO активизируется при нажатии кнопки "START/STOP".

Активным уровнем INTO считается нулевое состояние на выводе РВ6 микроконтроллера. Активный уровень задается программой и во время сброса не активизируется. В случае активизации INTO вызывается подпрограмма обработки вектора прерывания, которая запрещает прерывание и проверяет длительность нажатия кнопки. При выходе из подпрограммы обработки вектора прерывания разрешается общее прерывание.

2.6 Разработка программного обеспечения микроконтроллера

Микроконтроллер ведет отсчет реального времени. Время конвертируется из минут в формат 1:00 часов и затем в ШИМ импульс, подходящий для управления сервоприводом. Исходный код снабжен полными комментариями и легок для понимания в плане принципа работы.

Программное обеспечение написано на С, компиляция и отладка в AVR Studio. Отладку кода производить нужно с помощью AVR Dragon, которая использует встроенные в ATTiny24 возможности по отладке.

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


Рисунок 2.4 - Блок-схема алгоритма управления двигателем солнечных часов

#define F_CPU 2457600UL // частота кристалла

#define PWM_TOP F_CPU/60 // = 40960 – МАКС значение для таймера 0 (идет в OCR0A)

Эти прекомпиляторные инструкции определяют частоту кристалла и значение, вносящееся в регистр OCR1A, которое будет максимальным значением для таймера1 перед сбрасыванием на ноль. Нам надо, чтобы частота ШИМ была 60 Гц. Эти импульсы также используются в качестве временной оси для часов реального времени.

Следующие строки настраивают Таймер1 на быструю ШИМ, без предделителя частоты (то есть частота кристалла напрямую идет на Таймер1), а ШИМ Compare Output на выводе ОС1В.

TCCR1A = _BV(WGM11) | _BV(WGM10) | _BV(COM1B1);

TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10);

OCR1A = PWM_TOP; // ШИМ част = 60 Гц

Сейчас Таймер1 отсчитывает время от 0 до значения PWM_TOP, 60 раз каждую секунду (2457600/40960)

Вышеуказанные инструкции также делают выход OC1B высоким, когда счетчик меньше значения ОCR1A и 0 в обратном случае. Это и есть ШИМ – изменение значения OCR1B от 0 до PWM_TOP изменяет коэффициент заполнения от 0% до 100% на частоте ШИМ, которая не меняется: 60 колебаний каждую секунду, колебания просто уже или шире.

Следующая инструкция помещает сервопривод на положение OCR1B – промежуточное положение между максимальным и минимальным положениями сервопривода.

OCR1B = (SERVO_MAX + SERVO_MIN) / 2;

Это значение не составляет 50% коэффициента заполнения ШИМ, так как сервопривод перемещается от минимального положения до максимального с импульсом менее 50%, поэтому я определил значения defined SERVO_MAX и SERVO_MIN, основываясь на длительности импульсов, которые перемещают сервопривод в максимальное или минимальное положение:

#define SERVO_MAX PWM_TOP*1.65/(1000/60) // макс. поворот – на 2,35 млс импульса

#define SERVO_MIN PWM_TOP*0.75/(1000/60) // мин. поворот – на 0,70 млс импульса

Теперь нужно, чтобы переполнение таймера использовалось в качестве временной оси для часов реального времени:

TIMSK1 = _BV(TOIE1); // включить переполнение таймера (для часов реального времени)

sei(); // включить глобальные прерывания

Сейчас каждую 1/60-ую секунды выполняется следующая операция:

ISR(TIM1_OVF_vect) { … }

Эта операция выполняет целый ряд действий:

Отсчитывает реальное время, 60 умноженное на 1/60 секунды означает прошествие одной полной секунды, поэтому вместе с отсчетом минут и часов можно добавить и секундомер.

Заставляет лазер мигать каждую 1/10-ую секунду каждую секунду, если только не стоит соответствующая перемычка, в противном случае лазер включен постоянно.

Данная операция также определяет положение, в которое должен передвинуться сервопривод. Для выполнения этой задачи время конвертируется в общее количество минут, прошедших со времени 1:00, а полученный результат вписывается в диапазон

SERVO_MIN до SERVO_MAX

servo_pos = servo_min + ((hour-1)*60+min)*((servo_max-servo_min)/(11*60+59));

К-во Просмотров: 523
Бесплатно скачать Дипломная работа: Разработка солнечных часов