Академический Документы
Профессиональный Документы
Культура Документы
ОТЧЕТ
по лабораторной работе
по теме
«Преобразование аналоговых сигналов для обработки на сигнальном
контроллере»
Выполнили: Проверил:
ст. гр.640401 Каленкович Е.Н.
Жолудь А.В.
Воевода В.В.
Козич Е.С.
Минск 2020
Цель работы
Изучение особенностей аппаратной реализации аналого-цифрового
преобразования в системах цифровой радиосвязи.
Приобретение практических навыков программирования встроенных
аппаратных средств сигнального контроллера, предназначенных для аналого-
цифрового преобразования.
Задание
Выполнить аналого-цифровое преобразование сигнала, подаваемого на вход
AN0 сигнального контроллера с помощью встроенного АЦП. Результат записать в
буфер RAM сигнального контроллера (кол-во отсчетов 512). После записи
последнего значения буфер перезаписывается заново. Определить
среднеквадратическое значение отсчетов, записанных в буфер, и вывести результат
на LCD дисплей. Частота дискретизации 44 кГц.
Текст программы
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdint.h>
#include <math.h>
#include "lcd.h"
#include "lcd1.h"
#include "config.h"
#define SYS_FREQ 80000000UL
#define FCY SYS_FREQ/2
#include <libpic30.h>
void initAdc1(void)
{
/* set port configuration here */
AD1PCFGLbits.PCFG4 = 0; // ensure AN4/RB4 is analog (Temp Sensor)
AD1PCFGLbits.PCFG5 = 1; // ensure AN5/RB5 is analog (Analog Pot)
/* set channel scanning here, auto sampling and convert, with default read-format mode */
AD1CON1 = 0x00E4;
/* select 10-bit, 1 channel ADC operation */
AD1CON1bits.AD12B = 0;
/* enable DMA mode (ADC module sends all results to ADBUF0 and interrupts on each result */
ADCON1bits.ADDMAEN = 1;
/* No channel scan for CH0+, Use MUX A, SMPI = 1 per interrupt, Vref = AVdd/AVss */
AD1CON2 = 0x0000;
/* Set Samples and bit conversion time */
AD1CON3 = 0x032F;
void initTmr3()
{
T3CONbits.TON = 0; // Disable Timer
T3CONbits.TCS = 0; // Select internal instruction cycle clock
T3CONbits.TGATE = 0; // Disable Gated Timer mode
T3CONbits.TCKPS = 0b10; // Select 1:1 Prescaler
//INTCON1bits.NSTDIS = 0;
IPC2bits.T3IP = 3; // Set Timer1 Interrupt Priority Level
IFS0bits.T3IF = 0; // Clear Timer3 Interrupt Flag
IEC0bits.T3IE = 0; // Enable Timer3 interrupt
T3CONbits.TON = 1; // Start Timer3
}
void initDma0(void)
{
DMA0CONbits.AMODE = 0; // Configure DMA for Register indirect with post increment
DMA0CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode
DMA0CNT=(512-1);
DMACS0 = 0x0000; //Reset status register
/* DMA Channel Setup */
DMA0CON = 0x0000; // Interrupt after each transfer
DMA0REQ = 13; // Select ADC1 as DMA Request source
int main(void){
unsigned char buffer [5];
double volt;
TRISBbits.TRISB5=1;
Init_LCD();
lcd_cmd( 0x0C );
// Peripheral Initialisation
initAdc1(); // Initialize the A/D converter to convert Channel 5
initTmr3(); // Initialise the Timer to generate sampling event to ADC @ 44Khz rate
initDma0(); // Initialise the DMA controller to buffer ADC data in conversion order
Вывод