AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Передача телеметрии по UART

Отправка кадра телеметрии (напряжение, ток, статус) по UART.

DMC.46 · Телеметрия и служебное · ATmega328P

Задача

Сформировать и отправить по UART компактный кадр телеметрии с контрольной суммой.

Алгоритм

Кадр: заголовок + поля (uint16) + XOR-контрольная сумма. Побайтовая передача через UDR0.

Исходный код (C, avr-gcc)

⇩ Скачать 46-uart-telemetry.c

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>
static void uart_init(uint32_t baud){
  uint16_t ubrr=(F_CPU/(16UL*baud))-1; UBRR0H=ubrr>>8; UBRR0L=ubrr;
  UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); UCSR0B=(1<<TXEN0);
}
static void tx(uint8_t b){ while(!(UCSR0A&(1<<UDRE0))); UDR0=b; }
static void send16(uint16_t v,uint8_t *crc){ tx(v&0xFF); tx(v>>8); *crc^=(v&0xFF); *crc^=(v>>8); }
int main(void){
  uart_init(57600);
  volatile uint16_t vbat=1680, curr=520, status=1;
  for(;;){
    uint8_t crc=0; tx(0xA5); tx(0x5A);
    send16(vbat,&crc); send16(curr,&crc); send16(status,&crc);
    tx(crc);
    _delay_ms(100);
  }
}

Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf

Пояснения

Простой протокол «точка-точка»; на приёме сверяют заголовок и сумму. Основа своей телеметрии.

Смотрите также

Телеметрия