- •Аппаратно-программные средства цифровой обработки сигналов
- •230100.62 Информатика и вычислительная техника
- •Введение
- •1 Лабораторная работа № 1. Знакомство с системой Mathcad
- •Теоретическая часть
- •Постановка задачи
- •Теоретическая часть
- •1.3 Порядок выполнения работы
- •1.4 Контрольные вопросы
- •2 Лабораторная работа № 2. Моделирование сигнала
- •Постановка задачи
- •2.3 Порядок выполнения работы
- •2.4 Контрольные вопросы
- •3 Лабораторная работа № 3. Прямое и обратное дискретное преобразование Фурье
- •Теоретическая часть
- •3.2 Постановка задачи
- •3.3 Порядок выполнения работы
- •3.4 Контрольные вопросы
- •4 Лабораторная работа № 4. Фильтрация сигналов
- •Теоретическая часть
- •4.2 Постановка задачи
- •4.3 Порядок выполнения работы
- •4.4 Контрольные вопросы
- •5 Лабораторная работа № 5. Вычисление скользящего спектра сигнала
- •Теоретическая часть
- •5.2 Постановка задачи
- •5.3 Порядок выполнения работы
- •5.4 Контрольные вопросы
- •6 Лабораторная работа № 6. Исследование спектров солнечной активности
- •6.1 Теоретическая часть
- •6.2 Постановка задачи
- •6.3 Порядок выполнения работы
- •6.4 Контрольные вопросы
- •7 Лабораторная работа № 7. Классификация периодов солнечной активности
- •7.1 Теоретическая часть
- •7.2 Постановка задачи
- •7.3 Порядок выполнения работы
- •7.4 Контрольные вопросы
- •8 Лабораторная работа № 8. Работа с ацп и цап
- •8.1 Теоретическая часть
- •8.2 Постановка задачи
- •8.3 Порядок выполнения работы
- •8.4 Контрольные вопросы
- •9 Лабораторная работа № 9. Фильтр с конечной импульсной характеристикой
- •9.1 Теоретическая часть
- •9.2 Постановка задачи
- •9.3 Порядок выполнения работы
- •9.4 Контрольные вопросы
- •10 Литература, рекомендуемая для изучения тем
- •10.1 Основная литература
- •10.2 Дополнительная литература
- •Список сокращений и условных обозначений
- •Приложение а
- •(Обязательное)
- •Среднемесячные относительные числа солнечных пятен
- •За период 1700 -1984 годы.
- •Приложение б (обязательное) Листинг программы
- •Приложение в (обязательное) Листинг программы
Приложение б (обязательное) Листинг программы
#include "ADuC812.h" //прописаны основные регистры МК
#include "max.h" //модуль для работы с дополнительными регистрами
#include "lcd.h" //модуль для работы с ЖК-дисплеем
#include "kb.h" //модуль для работы с клавиатурой
#define Vref 2.5 //опорное напряжение для АЦП и ЦАП
#define Vz 0.27 //начальное напряжения для ЦАП
#define BUSY 0x80 //адрес бита занятости АЦП
#define START 0x10 //для старта однократно преобразования (5-ый бит ADCCON2)
#include "stdio.h"
//процедура инициализации ЦАП
void InitDac()
{
unsigned char wait;
DACCON &= ~0x03; //отключаем оба ЦАП
DACCON &= ~0x80;// устанавливаем режим 12-разрядного ЦАП
DAC0H = DAC0L = 0;//обнуляем ЦАП
DAC1H = DAC1L = 0;
DACCON &= ~0x60; //устанавливаем диапазон измерения от 0..2.5
DACCON |= 0x1C; //напряжение на выходе изменяется одновременно при записи в
//регистры DACxL
DACCON |= 0x01; //включить канал 0
for(wait = 0; wait < 30; ++wait); //задержка
}
//процедура усстановки напряжение V на выходе ЦАП0
void SetVoltage(float V)
{
unsigned short val;
val =(unsigned short)(V*0xFFF/ Vref );//преобразуем значение напряжения в
//соответствующий код ЦАП
val&=0xFFF; // проверка на выход из диапазона
DAC0H=val>>8; //установка значений, соответствующих напряжении V
DAC0L=val;
}
//инициализация АЦП
void init_adc(void)
{
while( ADCCON3 & BUSY ); //ожидание окончания возможного преобразования АЦП
ADCCON1 = 0x20; // установка делителя частоты равным 4
ADCCON2 = 0x00; //прерывания запрещено, режим ПДП отключен, одиночное
//преобразование, канал - 0
ADCCON1 |= 0x40; //включение АЦП
}
// функция возвращает значение напряжения на канале 0
unsigned short GetVoltage()
{
float v;
while( ADCCON3 & BUSY );// дождаться окончания предыдущего преобразования
ADCCON2 = START | ( 0 & 0x7 ); //запуск однократного преобразования на канале 0
while( ADCCON3 & BUSY ); //дождаться окончания преобразования
v = (( unsigned short )( ADCDATAH & 0xF ) << 8 ) | ADCDATAL;//получение кода от АЦП
v = v * Vref / 0xFFF;// преобразование кода в напряжение
return v;
}
//основная программа
void main()
{
float f,fDac;
char ch;
char buffer[10];
//Init_LCD(); //инициализация дисплея
InitDac(); //инициализация ЦАП
fDac=Vz; //начальное напряжение
SetVoltage(Vz); //установка напряжения на ЦАП
init_adc(); //инициализация АЦП
// LCD_Clear(); //очистка
f=GetVoltage(); //получение напряжения от АЦП
//sprintf(buffer,"%F",f); //преобразования числа f в строку buffer
//LCD_Type(&buffer); //вывод строки на ЖК-дисплей
while (1)
{
while (ScanKBOnce(&ch)!=1) //ожидаем нажатия клавиши клавиатуры
{
}//установка нового напряжения в зависимости от нажатой клавиши
if (ch="1") fDac=Vz;
if (ch="2") fDac=Vz*2;
if (ch="3") fDac=Vz*3;
if (ch="4") fDac=Vz*4;
if (ch="5") fDac=Vz*5;
if (ch="6") fDac=Vz*6;
if (ch="7") fDac=Vz*7;
if (ch="8") fDac=Vz*8;
if (ch="9") fDac=Vz*9;
SetVoltage(fDac);
f=GetVoltage();
//sprintf(buffer,"%F",f);
//LCD_Type(&buffer);
}
}
