Skip to content
Snippets Groups Projects
Controller.cpp 2.02 KiB
Newer Older

#include "Controller.h"

#include <stdint.h>

#include "usart.h"
#include "servo.h"


Controller controller;

static usart_regs registers
{
        &UCSRA,
        &UCSRB,
        &UCSRC,
        &UDR,
        &UBRRL,
        &UBRRH,
};

static servo_data blue_servo_data
{
        220,	//0°
        2200,	//180°

        10000,	//ICR_value
        20000	//Pulse_duration
};

Controller::Controller():   potenciometr(),
                            servoL(&DDRB, PB1, &OCR1A, blue_servo_data),
                            servoR(&DDRB, PB2, &OCR1B, blue_servo_data),
                            uart(registers)
{
    uart.set_operating_mode(uart.ASYNCHRONOUS_NORMAL);
    uart.set_baudrate(115200);
    uart.set_data_bits(8);
    uart.set_stop_bits(1);
    uart.set_parity(uart.PARITY_NONE);
    uart.enable_trasmitter();
    //uart.enable_RX_complete_interrupt();

    uart.transmit_string("\nServo headlight control\n");

    Ldata = {163, 820, 85, 113};
    Rdata = {163, 820, 85, 113};

    L_k = (Ldata.pot_max-Ldata.pot_min)/(Ldata.angle_max-Ldata.angle_min);
    R_k = (Rdata.pot_max-Rdata.pot_min)/(Rdata.angle_max-Rdata.angle_min);

    servo_ini();
}

void Controller::servo_ini()
{
    TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11);	//Fast PWM non-inverted
    TCCR1B |= (1<<WGM13)  | (1<<WGM12)  | (1<<CS11);	//Prescaler 8 -> 7.03Hz

    ICR1 = 10000;	//Top value -> 46.04Hz

    servoL.set_angle(113);
    servoR.set_angle(113);

}

void Controller::L_handler()
{
    uint8_t angle = ((potenciometr.adc_value+1963)/L_k)-30;
    servoL.set_angle(angle);
}

void Controller::R_handler()
{
    uint8_t angle = ((potenciometr.adc_value+1963)/R_k)-7;
    servoR.set_angle(angle);
}

void Controller::send_debug()
{
    uart.transmit_string("Pot:\t");
    uart.transmit_dec32(potenciometr.adc_value);
    uart.transmit_string("\t\t");
    uart.transmit_string("L:\t");
    uart.transmit_dec32(servoL.get_angle());
    uart.transmit_string("\t\t");
    uart.transmit_string("R:\t");
    uart.transmit_dec32(servoR.get_angle());
    uart.transmit_new_line();
}