Skip to content
Snippets Groups Projects
Commit 5f59cb8c authored by Martin Vítek's avatar Martin Vítek
Browse files

Add Controller class & code updates to work with it

parent 9f5d9ff2
Branches master
No related tags found
No related merge requests found
......@@ -35,6 +35,8 @@ set(SOURCE_FILES
Potenciometr.h
servo.cpp
servo.h
Controller.cpp
Controller.h
)
include_directories(libs/src)
......
#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();
}
#pragma once
#include <stdint.h>
#include "Potenciometr.h"
#include "servo.h"
#include "usart.h"
class Controller
{
private:
struct
{
uint16_t pot_min;
uint16_t pot_max;
uint8_t angle_min;
uint8_t angle_max;
}Ldata, Rdata;
uint8_t L_k;
uint8_t R_k;
public:
Potenciometr potenciometr;
servo_class servoL;
servo_class servoR;
usart uart;
Controller();
void servo_ini();
void L_handler();
void R_handler();
void send_debug();
};
extern Controller controller;
#include "Potenciometr.h"
Potenciometr potenciometr;
......@@ -59,5 +59,3 @@ class Potenciometr
ADCSRA |= (1<<ADSC);
};
};
extern Potenciometr potenciometr;
......@@ -3,19 +3,22 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#include "Potenciometr.h"
#include "Controller.h"
ISR(ADC_vect)
{
potenciometr.irq_handler();
controller.potenciometr.irq_handler();
}
ISR(TIMER0_OVF_vect)
{
potenciometr.start_conversion();
controller.potenciometr.start_conversion();
}
ISR(USART_RXC_vect)
{
uint8_t angle = UDR;
controller.servoL.set_angle(angle);
controller.servoR.set_angle(angle);
}
......@@ -2,76 +2,32 @@
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.h"
#include "Potenciometr.h"
#include "servo.h"
#include "Controller.h"
static usart_regs registers
{
&UCSRA,
&UCSRB,
&UCSRC,
&UDR,
&UBRRL,
&UBRRH,
};
usart uart(registers);
static servo_data blue_servo_data
{
220, //0°
2200, //180°
10000, //ICR_value
20000 //Pulse_duration
};
servo_class servoL(&DDRB, PB1, &OCR1A, blue_servo_data);
servo_class servoR(&DDRB, PB2, &OCR1B, blue_servo_data);
void servo_ini()
{
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); //Fast PWM non-inverted
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11); //Prescaler 8 -> 7.03Hz
//Pot min 163
//Pot max 820
ICR1 = 10000; //Top value -> 46.04Hz
//L max - 113°
//L min - 86°
servoL.set_angle(120);
servoR.set_angle(30);
}
//P max - 113°
//P min - 86°
int main(void)
{
sei();
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.transmit_string("\nServo headlight control\n");
servo_ini();
char angle;
for(;;)
{
angle = potenciometr.adc_value/5;
uart.transmit_dec32(potenciometr.adc_value);
uart.transmit_char('\t');
uart.transmit_dec32(angle);
uart.transmit_char(248);
uart.transmit_new_line();
controller.L_handler();
controller.R_handler();
servoL.set_angle(angle);
servoR.set_angle(angle);
controller.send_debug();
_delay_ms(50);
_delay_ms(20);
}
}
\ No newline at end of file
......@@ -29,7 +29,7 @@ class servo_class
volatile uint8_t *ddr;
uint8_t bit;
volatile uint16_t *ocr;
uint8_t current_angle;
volatile uint8_t current_angle;
servo_data &data;
uint8_t one_step;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment