Operácie

Generátor trojuholníkového signálu s R-2R prevodníkom

Zo stránky SensorWiki

Verzia z 20:24, 15. jún 2025, ktorú vytvoril StudentMIPS (diskusia | príspevky) (→‎Overenie)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)


Záverečný projekt predmetu MIPS / LS2025 - Meno Priezvisko


Zadanie

Generátor trojuholníkového signálu s R-2R prevodníkom 4310R-2R LF 103 https://eu.mouser.com/ProductDetail/Bourns/4310R-R2R-103

Úlohou bolo napísať program pomocou R-2R prevodníka na generovanie trojuholníkového signálu

4310R-2R LF 103

Literatúra:


Analýza a opis riešenia

Na vyriešenie môjho problému som použil 4310R-2R LF 103 prevodnik, bude mať štyri vstupy(PB0, PB1, PB2, PB3) a 1 výstup na A0 a 1 GND

Celkový pohľad na zariadenie.

Tuto mame schemu zapojenia

Schéma zapojenia.


Algoritmus a program

Čo robí program:

Generuje binárne hodnoty 0–15 na pinoch PB0–PB3 (D8–D11) mikrokontroléra AVR. Odosiela hodnoty cez UART na Serial Monitor/Plotter. Cyklus: zvyšuje od 0 do 15, znižuje od 15 do 1, s 5 ms oneskorením. Použité funkcie:

uart_init(): Inicializuje UART. uart_puts(): Odosiela reťazec cez UART. sprintf(): Konvertuje číslo na reťazec. _delay_ms(): Vytvára 5 ms oneskorenie. Výstup:

Piny PB0–PB3 zobrazujú binárnu hodnotu (napr. 5 = 0101). UART odosiela hodnoty ako text (0–15) pre Serial Monitor/Plotter.


#include <avr/io.h>

#include <util/delay.h>
#include <stdio.h>
#include <avr/io.h>
#include "uart.h"


#define F_CPU 16000000UL
#define D0 0 // PB0 (D8)
#define D1 1 // PB1 (D9)
#define D2 2 // PB2 (D10)
#define D3 3 // PB3 (D11)


#define DELAY_MS 5


int main(void) {
    DDRB |= (1 << D0) | (1 << D1) | (1 << D2) | (1 << D3);
    

    uart_init();
    
    char buffer[4]; 

    while (1) {
      
        for (uint8_t value = 0; value <= 15; value++) {
            PORTB = (PORTB & ~((1 << D0) | (1 << D1) | (1 << D2) | (1 << D3))) |
                    ((value & 0x01) << D0) |
                    ((value & 0x02) >> 1 << D1) |
                    ((value & 0x04) >> 2 << D2) |
                    ((value & 0x08) >> 3 << D3);
            sprintf(buffer, "%u", value);
            uart_puts(buffer);
            uart_puts("\r\n");
            _delay_ms(DELAY_MS);
        }


        for (uint8_t value = 15; value > 0; value--) {
            PORTB = (PORTB & ~((1 << D0) | (1 << D1) | (1 << D2) | (1 << D3))) |
                    ((value & 0x01) << D0) |
                    ((value & 0x02) >> 1 << D1) |
                    ((value & 0x04) >> 2 << D2) |
                    ((value & 0x08) >> 3 << D3);
            sprintf(buffer, "%u", value);
            uart_puts(buffer);
            uart_puts("\r\n");
            _delay_ms(DELAY_MS);
        }
    }
    
    return 0;
}
#ifndef UART_H
#define UART_H

void uart_init(void);
void uart_putc(char c);
void uart_puts(const char *s);
char uart_getc(void);

#endif // UART_H
#include <avr/io.h>
#include <util/setbaud.h>
#include "uart.h"

void uart_init(void) 
{
    UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;

#if USE_2X
    UCSR0A |= _BV(U2X0);
#else
    UCSR0A &= ~(_BV(U2X0));
#endif

    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */
}

void uart_putc(char c) 
{
    if (c == '\n') 
    {
        uart_putc('\r');
    }
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
    UDR0 = c;
}

void uart_puts(const char *s)
{
    while (*s) {
        uart_putc(*s);
        s++;
    }
}

char uart_getc(void) 
{
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
    return UDR0;
}

Zdrojový kód: Omelianenko.zip

Overenie

Po kontrole programu z hľadiska kvality prevedenia môžem povedať, že je celkom funkčný.

Aplikácia.

Video:



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.