Скачать 309.14 Kb.
|
Схема устройстваСхема моделируется в программе САПР Proteus. PROTEUS VSM — пакет программ для автоматизированного проектирования (САПР) электронных схем. Пакет представляет собой систему схемотехнического моделирования, базирующуюся на основе моделей электронных компонентов, принятых в PSpice. Отличительной чертой пакета PROTEUS VSM является возможность моделирования работы программируемых устройств: микроконтроллеров, микропроцессоров, DSP и проч. Библиотека компонентов содержит справочные данные. Дополнительно в пакет PROTEUS VSM входит система проектирования печатных плат. Пакет Proteus состоит из двух частей, двух подпрограмм: ISIS — программа синтеза и моделирования непосредственно электронных схем и ARES — программа разработки печатных плат. Вместе с программой устанавливается набор демонстрационных проектов для ознакомления. Использованы компоненты:
Для симуляции использованы устройства:
Рис. 1.20 – Принципиальная схема устройства Данное устройство разделено на три модуля: основная плата устройства, блок питания, семисегментный индикатор. Семисегментный индикатор подключается к плате с помощью гибкого шлейфа. Печатная плата разрабатывалась в САПР Proteus. Размер печатной платы: 58.4 х 77.5 мм Для экономии средства для травления, а также для уменьшения наводок использована большая площадка по всему периметру платы (рис. 4.1) Рис. 4.1 – Печатная плата устройства Программа написана на языке C и компилируется с помощью компилятора avr-gcc (WinAvr). Исходный код состоит из заголовочного файла main.h (приложение А) и файла main.с (приложение Б). Компиляция программы происходит следующим образом:
Рис. 3.1 – Проверка версии компилятора Далее описывается один из способов компиляции программы на примере Windows 7.
Рис. 3.2 – Открытие окна команд Это действие откроет командную строку с рабочей директорией, которую мы выбрали.
avr-gcc -Os -mmcu=atmega16 -DF_CPU=8000000UL -std=gnu99 main.c main.h -o result.elf -Os – флаг оптимизации -std=gnu99 – стандарт языка -DF_CPU=8000000UL – частота тактирования МК -mmcu=atmega16 – тип микроконтроллера -o result.elf – файл-результат компиляции При удачной компиляции появится файл с расширением elf (рис. 3.3) Рис. 3.3 – Результат компиляции
avr-objcopy -O ihex -R.eeprom result.elf firmware.hex (рис. 3.4) Рис. 3.4 – Результат выполнения команды avr-objcopy Теперь этим файлом можно прошить микроконтроллер. В Proteus нужно выбрать программу для микроконтроллера. Для этого нужно два раза нажать мышкой на микроконтроллер и выбрать прошивку. Также нужно задать частоту тактирования – внутренний генератор 8 мГц. Далее можно запустить симуляцию (Рис. 3.5) Рис. 3.5 – Симуляция работы устройства Как и ожидалось, дисплей и терминал выводят частоту генератора. Моделирование корпуса для устройства выполнено в программе КОМПАС-3D. КОМПАС-3D — система трехмерного проектирования, ставшая стандартом для тысяч предприятий, благодаря сочетанию простоты освоения и легкости работы с мощными функциональными возможностями твердотельного и поверхностного моделирования. Ключевой особенностью продукта является использование собственного математического ядра С3D и параметрических технологий, разработанных специалистами АСКОН. КОМПАС-3D обеспечивает поддержку наиболее распространенных форматов 3D-моделей (STEP, ACIS, IGES, DWG, DXF), что позволяет организовывать эффективный обмен данными со смежными организациями и заказчиками, использующими любые CAD / CAM / CAE-системы в работе. Размер готового устройства: 33 х 116 х 80 Рис. 5.1 – Корпус (крышка) Рис. 5.2 – Корпус (основание) ВЫВОДВ результате выполнения курсового проекта было смоделировано устройство для измерения частоты сигнала. Программа заняла всего лишь 16% памяти устройства, благодаря этому есть свободное пространство для последующей модернизации устройства. Например, добавить в устройство функцию вольтметра. Данных получилось достаточно для повторения устройства в реальной жизни: принципиальная схема, разводка печатной платы, список компонентов, а также чертёж корпуса для устройства. Данному устройству обязательно найдётся применение в цифровой и аналоговой схемотехнике, ведь можно измерить частоты выходных сигналов разнообразных генераторов (в разумных пределах). ЛИТЕРАТУРА
http://multimote.ru/avr-freq-meter/ - моя статья https://github.com/MultiMote/AVR-Freq-meter-7seg - Исходник на GitHub http://multimote.ru/wp-content/uploads/2015/04/freq-meter-KOMPAS.zip - Чертежи и модели в КОМПАС-3D Приложение А #ifndef __MAIN_H_ #define __MAIN_H_ #include #include typedef uint8_t byte; byte buf[16]; uint32_t freq; uint32_t freq_max; uint32_t measure_buf; // порт для сегментов #define SEGMENTS_DDR DDRA #define SEGMENTS_PORT PORTA // порт для разрядов #define DIGITS_DDR DDRC #define DIGITS_PORT PORTC #define SWITCH_TIME 45 // время между переключениями разрядов; чем меньше, тем меньше мерцает #define INPUT 0x00 #define OUTPUT 0xFF #define SYMBOLS_SIZE 11 // количество символов в таблице byte symbols[SYMBOLS_SIZE] = //состояния пинов для символов { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111, // 9 0b10000000 // . }; int main(void); void switchDigit(byte digit); // показать нужный разряд, остальные погасить; значения от 0 до 3 void showDigit(byte number, bool dot); // вывести символ на разряд, с точкой или без; значения от 0 до SYMBOLS_SIZE void initTimer(); // инициализация таймера (для нас - часового) void initInterrupts(); //инициализация прерываний void initUART(); //инициализация последовательного порта void sendByte(byte b); //отправка байта по UART void sendString(byte *str); //отправка строки по UART #endif //__MAIN_H_ Приложение Б #include "main.h" #include #include #include #include int main(void) { SEGMENTS_DDR = OUTPUT; // настраиваем порты ввода-вывода DIGITS_DDR = OUTPUT; DIGITS_PORT = 0xFF; initTimer(); initInterrupts(); initUART(); byte i; uint32_t num; sprintf(buf, "? Stabilization...\r\n"); sendString(buf); _delay_ms(100); // ожидаем стабилизации таймера sprintf(buf, "? Init finished!\r\n"); sendString(buf); while (1) { num = freq > 9999 ? 9999 : freq; // ограничиваем показания for (i = 0; i < 4; ++i) { // перебираем все разряды, разбираем частоту на цифры switchDigit(i); switch (i) { case 0: showDigit((byte) ((num / 1000) % 10), false); break; case 1: showDigit((byte) ((num / 100) % 10), false); break; case 2: showDigit((byte) ((num / 10) % 10), false); break; case 3: showDigit(num % 10, false); break; default: break; } _delay_ms(SWITCH_TIME); } } } ISR(TIMER2_OVF_vect) { // прерывание таймера при переполнении freq = measure_buf; if (freq > freq_max) freq_max = freq; measure_buf = 0; sprintf(buf, "> Freq: %dHz, ", freq); // отправляем данные sendString(buf); sprintf(buf, "Max: %dHz\r\n", freq_max); sendString(buf); } ISR(INT0_vect) { //внешнее прерывание measure_buf++; } void showDigit(byte digit, bool dot) { SEGMENTS_PORT = ~symbols[digit > SYMBOLS_SIZE - 1 ? 10 : digit] | (dot ? symbols[10] : 0); } void switchDigit(byte number) { DIGITS_PORT = number < 4 ? (byte) (1 << number) : 0x00; } void initTimer() { ASSR |= _BV(AS2); // асинхронный режим, тактируемся от часового кварца TCCR2 = _BV(CS20) | _BV(CS22); //предделитель 128, одна секунда TIMSK |= _BV(TOIE2); // включаем таймер } void initInterrupts() { MCUCR = (1 << ISC01) | (1 << ISC00); //прерывание по растущему форонту GICR = (1 << INT0); //включаем прерывание на INT0 sei(); // разрешаем прерывания } void initUART() { // выставляем скорость: 9600 при частоте 8МГц // UBRR=8000000/(16*9600)-1=51.0833, округляем = 51 (0x33) UBRRH = 0x00; UBRRL = 0x33; // Разрешаем приём и передачу UCSRB = (1 << RXEN) | (1 << TXEN); UCSRB |= (1 << RXCIE); // устанавливаем формат: 8 бит данных, 2 стоп бита UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0); } void sendByte(byte b) { while (!(UCSRA & (1 << UDRE))); // ожидаем завершения передачи UDR = b; // записываем байт в буфер } void sendString(byte *str) { while (*str != 0) sendByte(*str++); // побайтно отправляем строку } |