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

Working UART, ADC, motor sensing, servo

parent b9298593
No related branches found
No related tags found
No related merge requests found
......@@ -35,6 +35,16 @@ set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wl,--gc-sections -Wl,--relax -Os -mrela
set(SOURCE_FILES
main.cpp
servo.h
servo.cpp
lib/adc.h
lib/adc.cpp
lib/usart.h
lib/usart.cpp
Controller.h
Controller.cpp
irq.h
irq.cpp
)
#include_directories(libs/src)
......
//
// Created by martin.vitek on 10.7.16.
//
#include "Controller.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include "servo.h"
Controller controller;
static servo_data blue_servo_data
{
220, //0°
2200, //180°
5000, //ICR_value
17366 //Pulse_duration
};
static usart_regs uart_regs
{
&UCSRA,
&UCSRB,
&UCSRC,
&UDR,
&UBRRL,
&UBRRH
};
Controller::Controller(): servo(&DDRB, PB1, &OCR1A, blue_servo_data),
adc(),
uart(uart_regs)
{
//Servo ini
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); //Fast PWM non-inverted
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10); //Prescaler 64
ICR1 = 4000; //Top value
//UART ini
uart.set_operating_mode(uart.ASYNCHRONOUS_NORMAL);
uart.set_baudrate(115200);
uart.set_data_bits(8);
uart.set_stop_bits(1);
uart.enable_reciver();
uart.enable_trasmitter();
//ADC ini
DDRC = 0;
PORTC = 0;
ADMUX = (1<<REFS1) | (1<<REFS0);
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
//adc.set_reference_voltage(adc.INTERNAL_REFERENCE); //2.56V
//adc.set_prescaler(adc.PRESCALER_128); //115kHz
//adc.enable_interrupt();
//adc.set_channel(adc.ADC0);
//adc.enable_adc();
//TCC0 ini
TCCR0 = (1<<CS02); //225Hz
TIMSK |= (1<<TOIE0);
sei();
}
void Controller::print_debug()
{
uart.transmit_string("P: ");
uart.transmit_dec32(current_positive);
uart.transmit_string("\tN: ");
uart.transmit_dec32(current_negative);
uart.transmit_new_line();
}
\ No newline at end of file
#pragma once
#include "servo.h"
#include "lib/adc.h"
#include "lib/usart.h"
//Working from 25° to 140°
class Controller
{
//Enums
public:
enum servo_positions
{
OPEN_POSITION = 40,
CLOSE_POSITION = 120
};
//Instances
public:
servo_class servo;
adc_class adc;
usart uart;
//Variables
public:
volatile uint16_t current_positive;
volatile uint16_t current_negative;
volatile uint8_t channel;
//Methods
public:
Controller();
void timer0_handler()
{
adc.start_conversion();
}
void adc_handler()
{
switch (channel)
{
case 0: current_positive = ADC;
channel++;
adc.set_channel(adc.ADC1);
adc.start_conversion();
break;
case 1: current_negative = ADC;
channel = 0;
adc.set_channel(adc.ADC0);
default: channel = 0;
break;
}
}
void print_debug();
};
extern Controller controller;
#include "irq.h"
#include <avr/interrupt.h>
#include "Controller.h"
ISR(TIMER0_OVF_vect)
{
controller.timer0_handler();
}
ISR(ADC_vect)
{
controller.adc_handler();
}
ISR(BADISR_vect)
{
reti();
}
\ No newline at end of file
#pragma once
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect);
ISR(ADC_vect);
ISR(BADISR_vect);
\ No newline at end of file
#include <avr/io.h>
#include <util/delay.h>
//#include "gpio.h"
#include "Controller.h"
//Working from 25° to 140°
int main()
{
controller.uart.transmit_string("\n\rGate Servo Controller\n\r");
controller.servo.set_angle(60);
for(;;)
{
controller.print_debug();
_delay_ms(200);
}
}
/*
* sevoclass.cpp
*
* Created on: 27. 6. 2014
* Author: martin.vitek
*/
#include "servo.h"
#include <avr/io.h>
#include <stdint.h>
servo_class::servo_class(volatile uint8_t *ddr,
uint8_t bit,
volatile uint16_t *ocr,
servo_data &data):data(data)
{
this->ddr = ddr;
this->bit = bit;
this->ocr = ocr;
*ddr |= (1<<bit);
this->data = data;
one_step = data.pulse_duration / data.ICR_value;
one_degree_pulse = (data.max_duration - data.min_duration) / 180;
}
servo_class::~servo_class()
{
*ddr &= ~(1<<bit);
}
void servo_class::set_angle(uint8_t angle)
{
if (angle < 0) current_angle = 0;
else if (angle > 180) current_angle = 180;
else current_angle = angle;
*ocr = (data.min_duration + (one_degree_pulse * current_angle) ) / one_step;
}
/*
* sevoclass.h
*
* Created on: 27. 6. 2014
* Author: martin.vitek
*/
#pragma once
#include <avr/io.h>
#include <math.h>
#include <stdint.h>
struct servo_data
{
//Min a max doba kontrolniho pulzu v us
uint16_t min_duration;
uint16_t max_duration;
//Parametry PWM
uint16_t ICR_value;
uint16_t pulse_duration;
};
class servo_class
{
//Promenne
private:
volatile uint8_t *ddr;
uint8_t bit;
volatile uint16_t *ocr;
volatile uint8_t current_angle;
servo_data &data;
uint8_t one_step;
uint8_t one_degree_pulse;
//Metody
public:
//Konstruktor
servo_class(volatile uint8_t *ddr, uint8_t bit, volatile uint16_t *ocr, servo_data &data);
//Destruktor
~servo_class();
//Metody
void set_angle(uint8_t angle);
uint8_t get_angle() { return current_angle; };
};
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