Vous êtes sur la page 1sur 6

1

ONDA SENO Y LECTOR


TEMPERATURA
Manuel Godoy, Gineth Alejandra Rico, Sebastián Tautiva.

Resumen— la práctica que se realizó en el laboratorio


consistió realizar un programa el cual nos va a generar LM-35:
una onda seo por medio de un LM-35 y otra onda seno
generada por medio de un programa.
El sensor LM35, es un sensor de temperatura
Abstract— the practice which was carried out in the integrado de precisión cuyos rangos de operación oscilan
laboratory was a program which will generate a wave seo desde los -55°C hasta los 150°C, teniendo en cuenta
through LM-35 and another sine wave generated by a que este tipo de sensores ofrecen una precisión de +-
program. 1.4°C a temperatura ambiente. Además de ello, son del
tipo lineal; es decir, que no es necesario forzar al usuario
a realizar conversiones debido a que otros sensores están
I. INTRODUCCION basados en grados Kelvin.

ONDA SENO: Un LM35 puede funcionar a partir de los 5 V (en


corriente continua), sea por alimentación simple o por
Algunos tipos de oscilaciones periódicas tienen el doble alimentación (+/-). Sus características más
inconveniente de no tener definida su expresión importantes se describen a continuación:
matemática, por lo que no se puede operar
analíticamente con ellas. Por el contrario, la oscilación • Configurado para ser leído en grados Celsius.
sinusoidal no tiene esta indeterminación matemática y
presenta las siguientes ventajas: • Factor de escala lineal de +10 mV / ºC.
La función seno está perfectamente definida mediante
su expresión analítica y gráfica. Mediante la teoría de los • Rango de trabajo entre -55 ºC hasta 150 ºC.
números complejos se analizan con suma facilidad los
circuitos de alterna. • Apropiado para aplicaciones remotas.
Las oscilaciones periódicas no sinusoidales se pueden
descomponer en suma de una serie de oscilaciones • Bajo costo.
sinusoidales de diferentes frecuencias que reciben el
nombre de armónicos. Esto es una aplicación directa de • Funciona con tensiones entre 4 V hasta 30 V.
las series de Fourier.
• Menos de 60 uA de consumo.

• Baja impedancia de salida, 0.1 W, para cargas de 1


mA.

Por lo tanto, esta clase de sensores son los más usados en


la práctica debido a su reducido costo y escasas opciones
de mantenimiento, lo que hace un elemento viable en la
mayoría de sus aplicaciones.
Imagen 1. Onda seno.
2

const uint16_t Sine12bit[32] = {512, 612, 708, 796,


875, 938, 985, 1014, 1024, 1014,
985, 938, 874, 796, 708, 612, 512, 412, 316, 227, 150,
86, 39, 10, 0, 10, 39, 86, 150, 227, 316, 412};
const uint8_t Escalator8bit[6] = {0x0, 0x33, 0x66,
0x99, 0xCC, 0xFF};//valores predeterminados

uint8_t Idx = 0;
__IO uint8_t SelectedWavesForm = 1;
__IO uint8_t WaveChange = 1;

void DAC_PreConfig(void);
Imagen 1. LM-35.

None
II. OBJETIVOS
int main(void)
{
1. Emplear las herramientas del entorno de
desarrollo IAR Embedded Workbench para
compilar y ejecutar el programa para producir DAC_PreConfig();
interrupciones.
2. Crear un espacio de trabajo (Workspace) poder Configuracion
crear cada uno de los códigos necesarios para RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,
obtener la onda seno. ENABLE);
Configuracion timer
III. MATERIALES
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
 Computador con el programa IAR Embedded TIM_TimeBaseStructure.TIM_Period = 100; //Se
Workbench. define un periodo de 100
 Tarjeta STM32FXX. TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
 LM-35. //Prescala 0x0
 Osciloscopio. TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode =
IV. RESULTADOS OBTENIDOS TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,
1. Código para la onda seno. &TIM_TimeBaseStructure);

#include "stm32l1xx.h" // /* TIM2 TRGO selection */


TIM_SelectOutputTrigger(TIM2,
#if defined USE_STM32L152D_EVAL TIM_TRGOSource_Update);
#include "stm32l152d_eval.h"
#elif defined USE_STM32L152_EVAL Timmer 2 hablilitado
#include "stm32l152_eval.h" TIM_Cmd(TIM2, ENABLE);
#endif Configuracion del boton como intterupcion
#define DAC_DHR12R2_Address 0x40007414 STM_EVAL_PBInit(BUTTON_KEY,
#define DAC_DHR8R1_Address 0x40007410 BUTTON_MODE_EXTI);

while (1)
TIM_TimeBaseInitTypeDef {
TIM_TimeBaseStructure; /* If the wave form is changed */
DAC_InitTypeDef DAC_InitStructure; if (WaveChange == 1)
DMA_InitTypeDef DMA_InitStructure; {
Seleccion de forma de onda de acuerdo al swicht
3

if (SelectedWavesForm == 1) /* Escalator Wave generator -----------------------


{ -----------------*/

DAC_DeInit(); Configuracion del DAC por el canal1


Configuracion del conversor digital a analogo DAC_InitStructure.DAC_OutputBuffer =
DAC_InitStructure.DAC_Trigger = DAC_OutputBuffer_Enable;
DAC_Trigger_T2_TRGO; DAC_Init(DAC_Channel_1,
DAC_InitStructure.DAC_WaveGeneration = &DAC_InitStructure);
DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = /* DMA1 channel2 configuration */
DAC_OutputBuffer_Enable; DMA_DeInit(DMA1_Channel2);

DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;
= DAC_DHR12R2_Address; DMA_InitStructure.DMA_MemoryBaseAddr =
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Escalator8bit;
(uint32_t)&Sine12bit; DMA_InitStructure.DMA_BufferSize = 6;
DMA_InitStructure.DMA_DIR = DMA_InitStructure.DMA_PeripheralDataSize
DMA_DIR_PeripheralDST; = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_BufferSize = 32; DMA_InitStructure.DMA_MemoryDataSize =
DMA_InitStructure.DMA_PeripheralInc = DMA_MemoryDataSize_Byte;
DMA_PeripheralInc_Disable; DMA_Init(DMA1_Channel2,
DMA_InitStructure.DMA_MemoryInc = &DMA_InitStructure);
DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize /activacion del DMA1 po el canal 2
= DMA_PeripheralDataSize_HalfWord; DMA_Cmd(DMA1_Channel2, ENABLE);
DMA_InitStructure.DMA_MemoryDataSize = DAC_Cmd(DAC_Channel_1, ENABLE);
DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = /* Enable DMA for DAC Channel1 */
DMA_Mode_Circular; DAC_DMACmd(DAC_Channel_1, ENABLE);
DMA_InitStructure.DMA_Priority = }
DMA_Priority_High; /* DAC channel1 Configuration */
DMA_InitStructure.DMA_M2M = DAC_InitStructure.DAC_Trigger =
DMA_M2M_Disable; DAC_Trigger_T2_TRGO;
DMA_Init(DMA1_Channel3, DAC_InitStructure.DAC_WaveGeneration =
&DMA_InitStructure); DAC_WaveGeneration_Noise;

Activa el Dma por el canal 3 DAC_InitStructure.DAC_LFSRUnmask_TriangleAmpli


DMA_Cmd(DMA1_Channel3, ENABLE); tude = DAC_LFSRUnmask_Bits8_0;
DAC_InitStructure.DAC_OutputBuffer =
DAC_OutputBuffer_Enable;
/* DAC Channel2 Init */ DAC_Init(DAC_Channel_1,
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
&DAC_InitStructure); //Se define el canal 2 del
osciloscipio /* Enable DAC Channel1: Once the DAC
channel1 is enabled, PA.04 is
/* Enable DAC Channel2 */ automatically connected to the DAC
DAC_Cmd(DAC_Channel_2, ENABLE); converter. */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* Enable DMA for DAC Channel2 */
DAC_DMACmd(DAC_Channel_2, ENABLE); /* Set DAC Channel1 DHR12L register */
DAC_SetChannel1Data(DAC_Align_12b_L,
4

0x7FF0);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA
/* Enable DAC channel1 wave generator */ , ENABLE);
DAC_WaveGenerationCmd(DAC_Channel_1, /* Configure PA.04 (DAC_OUT1), PA.05
DAC_Wave_Noise , ENABLE); (DAC_OUT2) as analog */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |
/* Triangle Wave generator ------------------------ GPIO_Pin_5;
-----------------*/ GPIO_InitStructure.GPIO_Mode =
DAC_DeInit(); GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd =
/* DAC channel2 Configuration */ GPIO_PuPd_NOPULL;
DAC_InitStructure.DAC_Trigger = GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_Trigger_T2_TRGO; }
DAC_InitStructure.DAC_WaveGeneration =
DAC_WaveGeneration_Triangle;
#ifdef USE_FULL_ASSERT
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmpli
tude = DAC_TriangleAmplitude_1023; /**
DAC_InitStructure.DAC_OutputBuffer = * @brief Reports the name of the source file and the
DAC_OutputBuffer_Enable; source line number
DAC_Init(DAC_Channel_2, * where the assert_param error has occurred.
&DAC_InitStructure); * @param file: pointer to the source file name
* @param line: assert_param error line source
/* Enable DAC Channel2: Once the DAC number
channel2 is enabled, PA.05 is * @retval None
automatically connected to the DAC */
converter. */ void assert_failed(uint8_t* file, uint32_t line)
DAC_Cmd(DAC_Channel_2, ENABLE); {
/* User can add his own implementation to report the
/* Set DAC channel2 DHR12RD register */ file name and line number,
DAC_SetChannel2Data(DAC_Align_12b_R, ex: printf("Wrong parameters value: file %s on line
0x100); %d\r\n", file, line) */
}
WaveChange = !WaveChange; /* Infinite loop */
} while (1)
} {
} }
void DAC_PreConfig(void) }
{ }
GPIO_InitTypeDef GPIO_InitStructure;

/* DMA1 clock enable (to be used with DAC) */ En este programa, se logró generar la onda sinusoidal,
por medio de los canales de la tarjeta, primero se defino
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, el periodo que se va a utilizar, por medio de esto se pudo
ENABLE); observar que entre más periodo la frecuencia es más
pequeña, lo que quiere decir que es inversamente
/* DAC Periph clock enable */ proporcional.
Luego se definieron los canales que de la tarjeta que se
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, utilizaron para poder generar la onda. Por último se varió
ENABLE); el periodo para poder la onda con más claridad.

/* GPIOA clock enable */


5

Este programa genero dos ondas análogas en base de una ADC_InitStructure.ADC_ExternalTrigConvEdge =


conversión digital a análogo lo cual se ve reflejado en la ADC_ExternalTrigConvEdge_None; //Pin externo
forma de onda ADC_InitStructure.ADC_DataAlign =
ADC_DataAlign_Right; //datas en aDC
ADC_InitStructure.ADC_NbrOfConversion = 1;
Medición de temperatura con lm35 ADC_Init(ADC1, &ADC_InitStructure);
#include "stm32l1xx.h"
#include "LCD2x16.c"
ADC_RegularChannelConfig(ADC1,
#ifdef USE_STM32L152D_EVAL ADC_Channel_6, 1, ADC_SampleTime_16Cycles); //
#include "stm32l152d_eval.h" Tiempo de maestro en el canal del adc
#elif defined USE_STM32L152_EVAL
#include "stm32l152_eval.h" ADC_Cmd(ADC1, ENABLE); //ADC1
#endif

LCD_init();
GPIO_InitTypeDef GPIO_InitStructure; LCD_string("ADC1=", 0); //ADC1 tipo string con
ADC_InitTypeDef ADC_InitStructure; valor cero
Co
//int M0=0;
int main () { while (1) { //Condicional
int j; ADC_SoftwareStartConv(ADC1);
uint16_t M0=0; M0 = ADC1->DR; //M0 se la asigna el vaolor de
//uint32_t muestras = 0; ADC1
float temperatura = 0, conv=0,mil=0; conv = M0*500; //Multiplique M0 POR 500
(CONVOLUCION)
mil=conv/1023; //Se divide en valor de conv
Configuracion del reloj entre 1023
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AD temperatura=mil/10;
C1, ENABLE); for (j = 0; j<10000000; j++){}; // waste some
time
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA LCD_uInt16((int)temperatura, 0x06, 1);
, ENABLE);
Configuracion para el Puerto por el pin 6 // Se tomaron 16 muestras?
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //Pin // Se busca el promedio de 16 muestras
para la conección del LM-35 // Variables inicializadas para las siguientes
GPIO_InitStructure.GPIO_Mode = // muestras del conversor.
GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = M0 = 0;
GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure); };

RCC_HSICmd(ENABLE); En este programa, se logró generar la onda sinusoidal,


Configuración del adc y sus parámetros por medio del sensor de temperatura LM-35, primero se
definieron los puertos que se utilizaron para la conexión
ADC_InitStructure.ADC_Resolution = del LM-35 con las tarjeta. Se definieron los canales que
ADC_Resolution_12b; //Resolución para la LCD con se utilizaron para generar la onda. También se realizó la
12b de resolución conexión con la LCD para que por medio de esta nos
ADC_InitStructure.ADC_ScanConvMode = dejara ver la temperatura cuando varia.
ENABLE; Se tiene que tener en cuenta que para la LCD se
ADC_InitStructure.ADC_ContinuousConvMode = utilizaron 132 BITS para la resolución, para esto se tiene
ENABLE; que tener en cuenta que solo se pueden utilizar 10 – 12 –
6

16 – 32 bits para la resolución. em/425-conversor-anal%C3%B3gico-digital


 http://ingeniatic.euitt.upm.es/index.php/tecnologias/it
em/426-conversor-digital-anal%C3%B3gico
Análisis de resultados:  http://unicrom.com/comparador-con-amplificador-
operacional/
Se tiene que tener en cuenta varios aspectos importantes
ya que si no se hace esto, el programa puede no
funcionar, como por ejemplo definir los canales que se
van a utilizar para generar la onda por medio de la
tarjeta, también saber que el valor del periodo es
inversamente proporcional al valor de la frecuencia,
además que entre más grande el valor del periodo, más
grande será la onda.
También se debe tener en cuenta el valor que se va a
utilizar de resolución que es de 10 – 12 – 16 – 32 Bits
para la LCD porque de lo contrario no se podrá
observar nada en la LCD.

Las mediciones de temperatura pueden depender del


escalamiento para la conversión dado que sin este
tratamiento los valores de temperatura medidos no
serian relevantes.

CONCLUSIONES

 Se logró programar una onda sinusoidal solo


por código, utilizando debidamente los
canales de la tarjeta para que genere este tipo
de onda.
 Se logró programar un sensor de temperatura
LM-35 que se conectó con la tarjeta y una
LCD, generando así media de temperatura
muy próxima a la temperatura ambiente
 Se pudo notar que el valor del periodo es
inversamente proporcional al valor de la
frecuencia, además que entre más grande sea
el valor del periodo, más grande es la onda
que se obtiene.
 Para la resolución de la LCD solo se puede
utilizar valores de 10 – 12 – 16 – 32 Bits, ya
que si se toman otros valores diferentes a
estos, no se va a poder visualizar nada en la
LCD.

REFERENCES AND FOOTNOTES


 https://www.iar.com/
 https://www.iar.com/iar-embedded-workbench/
 http://armcortexm.blogs.upv.es/files/2012/06/Int
errupciones_STM32F.pdf
 http://ingeniatic.euitt.upm.es/index.php/tecnologias/it

Vous aimerez peut-être aussi