26
OBJETIVO: substituir el pulsador del Proyecto_3 por un potenciómetro. Su función será la misma que el pulsador, es decir, aumentar o disminuir la frecuencia de salida de nuestra señal senoidal almacenada en un vector del fichero sinetable.h. El código de la interrupción del TIMER16 será exactamente el mismo, el único cambio será substituir la variable “inc” por la variable “adc” procedente del ADC. La tensión tiene que ser digitalizada, primero pasará por un amplificador programable de ganancia (ajuste de margen dinámico) USER MODULE PGA, la salida de este ira a un conversor analógico-digital de tipo incremento USER MODULE ADCINCVR. Ángel Castillo Jordán TFC EPSC 78

por la variable “ ” procedente del - EETACdigsys.upc.es/ed/SED/grups_classe/07-08_Q2/SDR/PROJ4_A_Castillo/... · un amplificador programable de ganancia ... A/D se a completado

Embed Size (px)

Citation preview

OBJETIVO: substituir el pulsador del Proyecto_3 por un potenciómetro. Su función será la misma que el pulsador, es decir, aumentar o disminuir la frecuencia de salida de nuestra señal senoidal almacenada en un vector del fichero “sinetable.h” .

El código de la interrupción del TIMER16 será exactamente el mismo, el único cambio será substituir la variable “inc” por la variable “adc” procedente del ADC.

La tensión tiene que ser digitalizada, primero pasará por un amplificador programable de ganancia (ajuste de margen dinámico) USER MODULE PGA, la salida de este ira a un conversor analógico-digital de tipo incremento USER MODULE ADCINCVR.

Ángel Castillo Jordán TFC EPSC 78

Crearemos nuevo proyecto en PSoC Designer con nombre: Proyecto_4.

Potenciómetro entrada P0[6], tipo “High Z Analogic” Out analógica salida P0[3], tipo “High Z Analogic” USER MODULE LCD Port2. USER MODULE DAC8 ASC10 y ASD20 USER MODULE TIMER16 DBB00 y DBB01 USER MODULE ADCINCVR ASD11, DBB10, DBB11,

DCB12 USER MODULE PGA ACB01 Activar la opción “Enable interrupt generation control”

en PSoC Designer Project Settings DeviceEditor

Adjuntar fichero “sinetable.h”

Ángel Castillo Jordán TFC EPSC 79

Ángel Castillo Jordán TFC EPSC 80

Ángel Castillo Jordán TFC EPSC 81

Interrupción Terminal Count Ouput, escribimos valor a la salida con DAC8.

Terminal Count Output Fs = 8000 Hz

Igual que en el Proyecto 3.

Ángel Castillo Jordán TFC EPSC 82

Ángel Castillo Jordán TFC EPSC 83

Ángel Castillo Jordán TFC EPSC 84

Una vez configurados los recursos globales (CPU_Clock, VC1, VC2, Analog Power, Ref Mux)

Una vez configurados los parámetros mediante listbox, colocados e interconexionado los 5 USER MODULES LCD, TIMER16, DAC8, ADC y PGA.

Procedemos a “Generate Application”

Ventana “Application Editor” Escribir en el fichero “main.c” el código principal del sistema, verificar la tabla vector de interrupciones del fichero “boot.asm” y añadir la instrucción de salto hacia la ISR en el fichero: “timer16int.asm”

Ángel Castillo Jordán TFC EPSC 85

Ángel Castillo Jordán TFC EPSC 86

Ángel Castillo Jordán TFC EPSC 87

#include <m8c.h>

#include "PSoCAPI.h"

#include "sinetable.h“

#pragma interrupt_handler

Timer16_ISR_C

char unsigned Pointer=0;

char unsigned adc=0;

void main()

{

LCD_Start();

LCD_Position(0,0);

LCD_PrCString("SENO 8 BITS POT");

TIMER16_EnableInt();

M8C_EnableGInt;

PGA_Start(PGA_HIGHPOWER);

ADC_Start(ADC_HIGHPOWER);

DAC8_Start(DAC8_HIGHPOWER);

TIMER16_Start();

ADC_GetSamples(0);

while(1)

{

if(ADC_fIsDataAvailable()!=0)

{

adc=ADC_iGetData();

ADC_ClearFlag();

LCD_Position(1,0);

LCD_PrHexInt(adc);

}

}

}

El programa principal será el encargado de digitalizar la tensión procedente del potenciómetro y guardarla en la variable adc. El ADC estará operando de manera continuada para que cualquier variación de tensión sea digitalizada, guardada y modifique la frecuencia de salida (interrupción del TIMER16).

Ángel Castillo Jordán TFC EPSC 88

void Timer16_ISR_C()

{

DAC8_WriteBlind(SineData[Pointer]);

Pointer=Pointer+adc;

if (Pointer >= SINE_DATA_SIZE)

Pointer-=SINE_DATA_SIZE;

}

•La interrupción del TIMER16 es lafrecuencia de muestreo controla cada cuanto el DAC8 convierte un valor digital a un valor analógico.•La variable Pointer representa el puntero o índice del vector/tabla seno.•La resta final imprescindible para que el puntero comience en la posición correcta cada periodo.

Fichero “boot.asm”

Verificar que PSoC ha añadido la instrucción de salto al ISR (InterruptService Routine) de manera automática.

Interrupciones necesarias para el funcionamiento del conversor ADCde tipo incremento: ADC_CNT_ISR y ADC_PWM16_ISR.

Ángel Castillo Jordán TFC EPSC 89

...

org 24h ;PSoC Block DBB01 Interrupt Vector

ljmp _Timer16_ISR

reti

...

org 30h ;PSoC Block DBB10 Interrupt Vector

ljmp _ADC_CNT_ISR

reti

...

org 38h ;PSoC Block DCB12 Interrupt Vector

ljmp _ADC_PWM16_ISR

reti

Fichero “timer16int.asm”

Añadir instrucción de salto “ljmp” a la “interrupt_handler” declarada en “main.c” y comenzando con guión bajo “_CabeceraInterrupción” (muy importante el guión bajo).

Ángel Castillo Jordán TFC EPSC 90

_Timer16_ISR:

;@PSoC_UserCode_BODY@ (Do not change this line.)

;---------------------------------------------------

; Insert your custom code below this banner

;---------------------------------------------------

; NOTE: interrupt service routines must preserve

; the values of the A and X CPU registers.

ljmp _Timer16_ISR_C

;---------------------------------------------------

; Insert your custom code above this banner

;---------------------------------------------------

;@PSoC_UserCode_END@ (Do not change this line.)

reti

Power Settings 5.0V/24MHz

CPU_Clock SysClk/1 = 24 MHz

VC1=SysClk/N 16 1.5 MHz

VC2=VC1/N 2 750 KHz

SysClk_Source “Internal”

Analog Power SC On/Ref High

Ref Mux (Vdd/2)+/-(Vdd/2)

El resto de recursos globales los dejamos por defecto.

Ángel Castillo Jordán TFC EPSC 91

Ángel Castillo Jordán TFC EPSC 92

Índice Datasheet

1. Features and overview

2. Functional description

3. DC and AC electricalcharacteristics

4. Placement

5. Parameters and resources

6. APIs

7. Sample firware source code

8. Configuration register

Prototipo C Descripción

void PGA_Start(BYTE bPowerSetting) Inicializa el USER MODULE y estable el nivel de potencia para el bloque CT (Continuos Time) PSOC.bPowerSetting: PGA_OFF, PGA_LOWPOWER, PGA_MEDPOWER, PGA_HIGHPOWER.

void PGA_SetPower(BYTE bPowerSetting) Utilizado para apagar o encender el módulo

void PGA_Stop(void) Desactiva el USER MODULE.

Void PGA_SetGain(BYTE bGainSetting) Establece la ganancia para la amplificación.bGainSetting: PGA_G0_06, PGA_G0_12, PGA_G0_18, PGA_G0_25, PGA_G0_37, PGA_G0_43, PGA_G0_50, PGA_G0_56, PGA_G0_62, PGA_G0_68, PGA_G0_75, PGA_G0_81, PGA_G0_87, PGA_G0_93, PGA_G1_00, PGA_G1_06, PGA_G1_14, PGA_G1_23, PGA_G1_33, PGA_G1_46, PGA_G1_60, PGA_G1_78, PGA_G2_00, PGA_G2_27, PGA_G2_67, PGA_G3_20, PGA_G4_00, PGA_G5_33, PGA_G8_00, PGA_G16_0, PGA_G24_0, PGA_G48_0.

Ángel Castillo Jordán TFC EPSC 93

Ángel Castillo Jordán TFC EPSC 94

Índice Datasheet

1. Features and overview

2. Functional description

3. DC and AC electricalcharacteristics

4. Placement

5. Parameters and resources

6. APIs

7. Sample firware source code

8. Configuration register

Prototipo C Descripción

void ADC_Start(BYTE bPower) Inicializa el USER MODULE y establece el nivel de potencia para los bloques SC (Switched Capacitor).bPower: ADCINCVR_OFF, ADCINCVR_LOWPOWER, ADCINCVR_MEDPOWER, ADCINCVR_HIGHPOWER.

void ADC_Stop(void) Detiene los bloques analógicos SC y los bloques digitales. Es recomendable para ahorrar energía si la conversión A/D no está en uso.

void ADC_GetSample(BYTE bNumSamples) Inicializa y empieza el algoritmo A/D para un número de samples indicado en bNumSamples como un valor de 8 bit. Si bNumSamples es 0, A/D funciona continuamente. No olvidar activar las interrupciones globales con la instrucción M8C_EnableGInt;

char ADC_fIsDataAvailable(void) Devuelve un valor distinto de 0 cuando la conversión A/D se a completado y el dato está disponible para leer.

int ADC_iGetData(void) Devuelve el dato convertido a digital. La función ADC_fIsDataAvailable() se tiene que llamar a priori antes de guardar el dato para asegurarnos que es válido. El dato se tiene que guardar antes de que la siguiente conversión se complete sino el dato será sobre escribido.

void ADC_ClearFlag(void) Elimina el indicador (flag) de dato disponible. Esta función se llamará después de leer/guardar el dato.

Ángel Castillo Jordán TFC EPSC 95

Los parámetros para introducir mediante listbox en la ventana “Device Editor” para la correcta configuración del USERMODULE ADC.

Input=ACB01selecciona como entrada para el ADC la salida del PGA ubicado en el bloque ACB01.

ClockPhase=Norm sincronización con el resto de bloques PSOC.

Clock=VC2=2 750 KHz será el clock para los bloques digitales y analógicos que componen el USER MODULE ADC.

ADCResolution=8 Bits y DataFormat=Unsigned valores entre [0,255]

CalcTime≥180·750 KHz/24 MHz ≥ 5.625=6(+1)7

CalcTimeEs el tiempo necesario para calcular el resultado de la conversión A/D, se tiene que sumar un 1 al resultado de la ecuación.

Ángel Castillo Jordán TFC EPSC 96

SampleRate=750 KHz/(2^8+2+6)=728 samples/seg.

Ángel Castillo Jordán TFC EPSC 97

Compilamos y creamos el proyecto “build”.

Si todo es correcto fichero .hex de salida.

Pulsamos botón “Program Part” PSoC Programmer v2.32.0.3

Grabación botón PSoC MiniProg.

Ángel Castillo Jordán TFC EPSC 98

Pulsamos el botón para alimentar la placa de entrenamiento PSoCEval1.

Conectamos un cable minijack de audio desde el conector hembra en el P0[3] a la entrada de audio la tarjeta de sonido.

Conectamos potenciómetro a la entrada P0[6]. Abrimos software osciloscopio implementado en labview con

nombre: Soundcard Scope V 1.22

Ángel Castillo Jordán TFC EPSC 99

Voltaje DC [V] Valor decimal Valor hexadecimal teórico

Valor hexadecimal real

0.0 0 0x00 0x02

0.5 25.526 0x1A 0x1A

1.0 51 0x33 0x35

1.5 76.577 0x4D 0x4E

2.0 102 0x66 0x67

2.5 127.5128 0x80 0x81

3.0 153 0x99 0x9B

3.5 178.5179 0xB3 0xB6

4.0 204 0xCC 0xCE

4.5 229.5230 0xE6 0xE8

5.0 255 0xFF 0xFFÁngel Castillo Jordán TFC EPSC

100

Valores de tensión medidos con multímetro, resultado de la digitalización a 8 Bits mostrado en la pantalla LCD. La variación de la tensión se realiza mediante el potenciómetro.

Resultado ADC=0x02

Escala = 200mV/Div

Vpp = 2.505 V

Señal senoidal porque

aplicamos filtro por

Software.

Ángel Castillo Jordán TFC EPSC101

Resultado ADC=0x02

fs = 8021 Hz

fout teórica =

= 2·8021/256 =

= 62.66 Hz

fout real= 63.281 Hz

Señal senoidal porque

aplicamos filtro por

Software.

Ángel Castillo Jordán TFC EPSC102

Resultado ADC = 0x02

fs = 8021 Hz

fout teórica = 2·8021/256 =

= 62.66 Hz

fout real = 63.42 Hz

Aplicamos filtro paso bajo por

software a una frecuencia de

corte 105 Hz porque el

segundo alias está centrado

2·63.42+63.42 = 190 Hz

Ángel Castillo Jordán TFC EPSC103