Автор работы: Пользователь скрыл имя, 14 Августа 2013 в 12:02, курсовая работа
Применение микропроцессорных средств позволяет достаточно легко программно реализовывать генераторы импульсов, в том числе с возможностью на ходу изменять частоту и количество импульсов.
Анализ технического задания показывает, что проектируемое устройство должно выполнять 4 основные задачи
Содержать счетчик со срабатыванием прерывания с частотой 10 Гц
Формировать пачки импульсов с частотой 10 кГц с возможностью задать извне их количество.
Считывать число с переключателей и формировать число, которое будет являться количеством импульсов в пачке.
Осуществлять вывод информации о количестве импульсов на семисегментные индикаторы.
Введение ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙4
Конкретизация технического задания ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙5
Разработка структурной схемы ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙6
Разработка схемы алгоритма прикладной программы ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙7
Разработка принципиальной схемы ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙8
Разработка управляющей программы ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙9
Заключение ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙11
Список использованных источников ∙∙∙∙∙∙∙∙∙∙∙∙∙
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
ЗАДАНИЕ
на курсовое проектирование по дисциплине
«Микропроцессорные устройства и системы»
студенту
группа ____ ____________ факультет _______ ЗФ________
Тема проекта: Генератор пачек импульсов
Исходные данные к проекту:
1) Пачки импульсов следуют с частотой 10 Гц
2) Частота импульсов в пачке 10 кГц
3) Число импульсов в пачке от 1 до 100, выбирается переключателем и отображается на цифровых индикаторах
Содержание пояснительной записки (перечень подлежащих разработке вопросов):
выбор микроконтроллера, обоснование функциональной схемы, разработка полной принципиальной схемы устройства с перечнем элементов и листинга управляющей программы .
Перечень графического материала (с точным указанием обязательных
чертежей и схем):
схема электрическая принципиальная — 1 лист
Дата выдачи задания:
______________________________
Руководитель
профессор кафедры ПрЭ ________________________ А.В.Шарапов (подпись)
Задание принял к исполнению ____________________
(дата)
__________ (подпись студента)
Содержание
Список использованных
источников ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
Приложение А. Листинг
управляющей программы ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
Приложение Б. Принципиальная
схема устройства∙∙∙∙∙∙∙∙∙∙∙∙∙∙
Приложение В. Перечень
элементов∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
Применение микропроцессорных средств позволяет достаточно легко программно реализовывать генераторы импульсов, в том числе с возможностью на ходу изменять частоту и количество импульсов.
Анализ технического задания показывает, что проектируемое устройство должно выполнять 4 основные задачи
Одновременное выполнение поставленных задач обеспечивается использованием таймера и режима прерывания программы по его переполнению.
Наиболее оптимальным решением, на мой взгляд, является использование контроллера Atmega8, так как это позволяет с минимальными затратами на разработку подключить на один порт индикацию, переключатели на второй и частично третий порт, и остальные выводы третьего порта для вывода сигнала, плюс свободные выходы, которые можно использовать, например, для генерации второго сигнала. А также в нем имеется все необходимое для выполнения поставленной задачи – программируемые таймеры с программируемыми выходами, сторожевой таймер, ПЗУ и ОЗУ. Алгоритм работы: таймер постоянно считает, на переключателях выставляется число, которое приплюсовывается к единице (изначальное число импульсов в пачке - один). Программа считает количество выданных импульсов. По достижении заданного числа импульсов меняются настройки таймера и он выключается. Для динамического изменения времени задержки выключения выхода, в зависимости от того сколько останется времени до момента выдачи следующей пачки импульсов, введен параметр, рассчитывающий эту задержку используя число импульсов.
Устройство ввода представляет
собой два десятипозиционных
переключателя. Десятичное число, поступающее
на узел обработки ввода, преобразуется
шифраторами в двоично-
Далее на выходе контроллера РВ2(ОС1В) появляется заданный сигнал, и на устройство индикации выводится число, набранное на переключателях. В устройстве индикации также используются резисторы подтяжки.
*Происходит изменение
частоты переполнения счетчика,
для вывода импульсов с
Для ввода числа используются
десятипозиционные
Программа рассчитана на работу от тактовых сигналов частотой 1 МГц
Объявление переменных
char count=0;
int imp,part1,part2,decbin,
unsigned int delay;
char temp1,temp2,impdes,imped,
flash char numInd[11]={63,6,91,79,102,
Массив numInd[11] – кодировка чисел для семисегментного индикатора.
После инициализации портов – настройка счетчиков
TCCR1A=0b00110011;
TCCR1B=0b00011010;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x27;
OCR1BH=0x00;
OCR1BL=0x23;
TIMSK=0x04;
В основном цикле программы:
Преобразование двоично-
decbin=~PIND;
decbin2=decbin;
part1=((decbin&0b11110000)>>4)
part2=decbin2&0b00001111;
imp=part1+part2+1;
И далее следует вывод числа на светодиодные индикаторы
Программа, осуществляющая вывод заданного количества импульсов в определенные промежутки запускается через прерывание по переполнению счетчика.
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
count++;
OCR1AH=0x00;
OCR1AL=0x27;
OCR1BH=0x00;
OCR1BL=0x23;
TCCR1A|=0b00110000;
if (count>(imp+1)){
delay=(40000-(imp*40));
TCCR1A&=0b11001111;
OCR1BH=((delay>>8)&0xFF);
OCR1BL=((delay)&0xFF);
OCR1AH=((delay>>8)&0xFF);
OCR1AL=((delay)&0xFF);
count=0;
}
Здесь происходит перенастройка счетчика на частоту 10 кГц и осуществляется вывод импульса. При следующем прерывании выводится следующий импульс. Переменная count считает количество импульсов. При превышении необходимого количества импульсов формируется задержка до следующей пачки, перенастраивается счетчик и сбрасывается переменная count.
Заключение.
Для выполнения этой задачи можно использовать любые контроллеры семейства Mega, так как здесь выбран один из самых простых данного семейства. При использовании более мощного контроллера возможно расширение функций устройства, добавление связи с внешними приборами. Переделка данной программы под другую частоту не требует особенных усилий, так что возможно снижение энергопотребления устройства, либо добавление новых функций, требующих высокого быстродействия
Список использованных источников.
Приложение А
Листинг управляющей программы
#include <mega8.h>
#include <delay.h>
char count=0;
int imp,part1,part2,decbin,
unsigned int delay;
char temp1,temp2,impdes,imped,
flash char numInd[11]={63,6,91,79,102,
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
count++;
OCR1AH=0x00;
OCR1AL=0x27;
OCR1BH=0x00;
OCR1BL=0x23;
TCCR1A|=0b00110000;
if (count>(imp+1)){
delay=(40000-(imp*40));
TCCR1A&=0b11001111;
OCR1BH=((delay>>8)&0xFF);
OCR1BL=((delay)&0xFF);
OCR1AH=((delay>>8)&0xFF);
OCR1AL=((delay)&0xFF);
count=0;
}
}
void main(void)
{
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=0 State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x3C;
// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTD=0xFF;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 400,000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Discon.
// OC1B output: Inverted
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0b00110011;
TCCR1B=0b00011010;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x27;
OCR1BH=0x00;
OCR1BL=0x23;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
while (1)
{ #asm ("wdr");
decbin=~PIND;
decbin2=decbin;
part1=((decbin&0b11110000)>>4)
part2=decbin2&0b00001111;
imp=part1+part2+1;
temp1=imp;
temp2=imp;
hundr=0;
impdes=temp1/10;
imped=(temp2-(impdes*10));
PORTC=numInd[imped];
PORTB&=0b11011111;
delay_ms(5);
PORTB|=0b00111000;
delay_ms(5);
PORTC=numInd[impdes];
PORTB&=0b11101111;
delay_ms(5);
PORTB|=0b00111000;
delay_ms(5);
if (imp==100) {
hundr=1;
}
PORTC=numInd[hundr];
PORTB&=0b11110111;
delay_ms(5);
PORTB|=0b00111000;
delay_ms(5);
// Place your code here
};
}
Приложение Б
Приложение В