Вы находитесь на странице: 1из 5

Учреждение образования

«Белорусский государственный университет информатики и


радиоэлектроники»

Кафедра информационных радиотехнологий

ОТЧЕТ
по лабораторной работе
по теме
«Преобразование аналоговых сигналов для обработки на сигнальном
контроллере»

Выполнили: Проверил:
ст. гр.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>

unsigned int BufferAdc[512] __attribute__((space(dma)));


int i=0;

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;

/* set channel scanning here for AN4 and AN5 */


AD1CSSL = 0x0000;

/* channel select AN0 */


AD1CHS0 = 0x0000;

/* reset ADC interrupt flag */


IFS0bits.AD1IF = 0;

/* enable ADC interrupts, disable this interrupt if the DMA is enabled */


IEC0bits.AD1IE = 0;

/* turn on ADC module */


AD1CON1bits.ADON = 1;
}

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

TMR3 = 0; // Clear timer register


PR3 = 909; // Trigger ADC1 every 0.23us @ 40 MIPS
// Load the period value FCY/Fd=40000000/44000

//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

/* initialize DMA Peripheral SFR Address */


DMA0PAD = (int) &ADC1BUF0;

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

/* DMA buffer 1 Start address for DPSRAM Address */


DMA0STA = (unsigned int)BufferAdc;

IPC1bits.DMA0IP = 4; //Set the DMA interrupt priority level to 4


IFS0bits.DMA0IF = 0; //Clear the DMA interrupt flag bit
IEC0bits.DMA0IE = 1; //Set the DMA interrupt enable bit

DMA0CONbits.CHEN=1; // Enable DMA


}

int main(void){
unsigned char buffer [5];
double volt;

// Configure FRC to operate the device at 40MIPS


// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
// Fosc= 8.00M*40/(2*2)=80.0000Mhz for 40MIPS input clock
PLLFBD=38; // M=40
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
OSCTUN=0; // Tune FRC oscillator, if FRC is used

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

// Turn on the A/D converter


while(1){
float result=0, signal=0;
for( i=0;i<512;i++){
result+= pow(BufferAdc[i],2);
}
result /= 512;
result=sqrt(result);
volt = result*3.3/4096;
sprintf (buffer,"%.5f",volt);
lcd_cmd(0x01);
lcd_cmd(0x0c);
puts_lcd(buffer,5);
__delay_ms(200);
}
return (EXIT_SUCCESS);
}

void __attribute__((interrupt, no_auto_psv)) _DMA0Interrupt(void)


{
IFS0bits.DMA0IF = 0; //Clear the DMA0 Interrupt Flag
}

Вывод

В ходе данной лабораторной работы познакомились с особенностями


реализации аналого-цифрового преобразования на сигнальном контроллере
dsPIC33F. Познакомились со средой MPLAB X IDE. Настроили
конфигурационные биты для работы платы. Настроили работу Timer3 с частотой
запуска модуля АЦП равной частоте дискретизации. Настроили DMA для хранения
определенного кол-ва отсчетов в буфере и последующего вычисления
среднеквадратического значения. Вывели данные на экран, с помощью
подключенной библиотеки lcd.h и lcd.c.

Вам также может понравиться