Programación de Microcontroladores LPC40xx en C para Adquisición de Datos y Control

Informática y Telecomunicaciones3,17 KB

16BITSADQSERIE

#include <lpc40xx.h>
#include <timer_lpc40xx.h>

unsigned char adq_serie_16bits (void);
void timer1_retardo_ms(unsigned int retardo_en_ms);

int main(void){
    unsigned int b = 0;
    char cadena[15];
    while (1){
        for (b = 0; b <= 15; b++){
            cadena[b] = adq_serie_16bits();
            LPC_GPIO2->SET = cadena[b];
            if (b == 15){
                LPC_GPIO1->SET = (1 << 2);
            }
        }
        timer1_retardo_ms(50);
        LPC_GPIO1->CLR = (1 << 2);
        timer1_retardo_ms(50);
        b = 0;
    }
}

unsigned char adq_serie_16bits (void){
    unsigned char i, byte = 0, dato;
    for (i = 0; i < 16; i++){
        while (LPC_GPIO0->PIN & (1 << 3));
        while (!(LPC_GPIO0->PIN & (1 << 3)));
        if (LPC_GPIO1->PIN & (1 << 0))
            dato = 1;
        else
            dato = 0;
        byte = (byte << 1) + dato;
    }
    return byte;
}

void timer1_retardo_ms (unsigned int retardo_en_ms){
    LPC_TIM1->TCR = 0;
    LPC_TIM1->PC = 0;
    LPC_TIM1->TC = 0;
    LPC_TIM1->PR = 60000 - 1;
    LPC_TIM1->MR0 = retardo_en_ms - 1;
    LPC_TIM1->MCR = 1;
    LPC_TIM1->IR = 1;
    LPC_TIM1->TCR = 1;
    while ((LPC_TIM1->IR & (1 << 0)) == 0) {}
}

TERBUF60ADCMEDIA

#include <lpc40xx.h>
#include <timer_lpc40xx.h>
#include "glcd.h"

float medir_temperatura(void);
void TIMER0_IRQHandler(void);

int main(void){
    glcd_inicializar();
    glcd_borrar();
    LPC_IOCON->P0_26 = 1;
    LPC_SC->PCONP |= (1 << 12);
    LPC_ADC->CR = (1 << 21) | (((PeripheralClock / 1000000) - 1) << 8);
    LPC_TIM0->TCR = 0;
    LPC_TIM0->PC = 0;
    LPC_TIM0->TC = 0;
    LPC_TIM0->MCR = 3;
    LPC_TIM0->PR = PeripheralClock / 1000000 - 1; // VALOR DE PERIPHERAL
    LPC_TIM0->MR0 = 1000 * (1000 - 1); // Retardo 1s
    NVIC_ClearPendingIRQ(TIMER0_IRQn);
    NVIC_SetPriority(TIMER0_IRQn, 0);
    NVIC_EnableIRQ(TIMER0_IRQn);
    __enable_irq();
    LPC_TIM0->TCR = 1;
    timer_inicializar(TIMER0);
    timer_iniciar_ciclos_ms(TIMER0);
    while(1);
}

float medir_temperatura(void){
    LPC_ADC->CR = (LPC_ADC->CR & ~0xFF) | (1 << 3);
    LPC_ADC->CR |= (1 << 24);
    while (!LPC_ADC->GDR & (1 << 31));
    return ((((LPC_ADC->DR[3] >> 4) & 0xFFF) * 330) / 1024);
}

void TIMER0_IRQHandler(void) {
    float temperatura = 0;
    float calcularmedia = 0, media = 0;
    static uint32_t buffer_circular_temperatura[60];
    static uint32_t indice_buffer = 0;
    
    NVIC_ClearPendingIRQ(TIMER0_IRQn);
    LPC_TIM0->IR = 1;
    
    for(indice_buffer = 0; indice_buffer < 60; indice_buffer++){
        temperatura = medir_temperatura();
        buffer_circular_temperatura[indice_buffer] = temperatura;
        calcularmedia += buffer_circular_temperatura[indice_buffer];
    }
    
    media = calcularmedia / 60;
    glcd_xprintf(0, 0, WHITE, BLACK, FONT16X32, "Valor: %1.2f ºC y Media: %1.2fºC", temperatura, media);
    
    if (indice_buffer > 59) 
        indice_buffer = 0;
}

Descargar

PDF Word HTML