1 #include "../hardware_api.h"
3 #if defined(__AVR_ATmega2560__)
6 void _pinHighFrequency(
const int pin){
10 if (pin == 13 || pin == 4 ) {
11 TCCR0A = ((TCCR0A & 0b11111100) | 0x01);
12 TCCR0B = ((TCCR0B & 0b11110000) | 0x01);
14 else if (pin == 12 || pin == 11 )
15 TCCR1B = ((TCCR1B & 0b11111000) | 0x01);
16 else if (pin == 10 || pin == 9 )
17 TCCR2B = ((TCCR2B & 0b11111000) | 0x01);
18 else if (pin == 5 || pin == 3 || pin == 2)
19 TCCR3B = ((TCCR2B & 0b11111000) | 0x01);
20 else if (pin == 8 || pin == 7 || pin == 6)
21 TCCR4B = ((TCCR4B & 0b11111000) | 0x01);
22 else if (pin == 44 || pin == 45 || pin == 46)
23 TCCR5B = ((TCCR5B & 0b11111000) | 0x01);
31 void _configure2PWM(
long pwm_frequency,
const int pinA,
const int pinB) {
34 _pinHighFrequency(pinA);
35 _pinHighFrequency(pinB);
41 void _configure3PWM(
long pwm_frequency,
const int pinA,
const int pinB,
const int pinC) {
44 _pinHighFrequency(pinA);
45 _pinHighFrequency(pinB);
46 _pinHighFrequency(pinC);
54 analogWrite(pinA, 255.0*dc_a);
55 analogWrite(pinB, 255.0*dc_b);
63 analogWrite(pinA, 255.0*dc_a);
64 analogWrite(pinB, 255.0*dc_b);
65 analogWrite(pinC, 255.0*dc_c);
71 void _configure4PWM(
long pwm_frequency,
const int pin1A,
const int pin1B,
const int pin2A,
const int pin2B) {
74 _pinHighFrequency(pin1A);
75 _pinHighFrequency(pin1B);
76 _pinHighFrequency(pin2A);
77 _pinHighFrequency(pin2B);
83 void _writeDutyCycle4PWM(
float dc_1a,
float dc_1b,
float dc_2a,
float dc_2b,
int pin1A,
int pin1B,
int pin2A,
int pin2B){
85 analogWrite(pin1A, 255.0*dc_1a);
86 analogWrite(pin1B, 255.0*dc_1b);
87 analogWrite(pin2A, 255.0*dc_2a);
88 analogWrite(pin2B, 255.0*dc_2b);
94 int _configureComplementaryPair(
int pinH,
int pinL) {
95 if( (pinH == 4 && pinL == 13 ) || (pinH == 13 && pinL == 4 ) ){
97 TCCR0A = ((TCCR0A & 0b11111100) | 0x01);
99 if(pinH == 13 ) TCCR0A = 0b10110000 | (TCCR0A & 0b00001111) ;
100 else TCCR0A = 0b11100000 | (TCCR0A & 0b00001111) ;
102 TCCR0B = ((TCCR0B & 0b11110000) | 0x01);
103 }
else if( (pinH == 11 && pinL == 12 ) || (pinH == 12 && pinL == 11 ) ){
105 TCCR1B = ((TCCR1B & 0b11111000) | 0x01);
107 if(pinH == 11 ) TCCR1A = 0b10110000 | (TCCR1A & 0b00001111) ;
108 else TCCR1A = 0b11100000 | (TCCR1A & 0b00001111) ;
109 }
else if((pinH == 10 && pinL == 9 ) || (pinH == 9 && pinL == 10 ) ){
111 TCCR2B = ((TCCR2B & 0b11111000) | 0x01);
113 if(pinH == 10 ) TCCR2A = 0b10110000 | (TCCR2A & 0b00001111) ;
114 else TCCR2A = 0b11100000 | (TCCR2A & 0b00001111) ;
125 int _configure6PWM(
long pwm_frequency,
float dead_zone,
const int pinA_h,
const int pinA_l,
const int pinB_h,
const int pinB_l,
const int pinC_h,
const int pinC_l) {
129 ret_flag += _configureComplementaryPair(pinA_h, pinA_l);
130 ret_flag += _configureComplementaryPair(pinB_h, pinB_l);
131 ret_flag += _configureComplementaryPair(pinC_h, pinC_l);
136 void _setPwmPair(
int pinH,
int pinL,
float val,
int dead_time)
138 int pwm_h =
_constrain(val-dead_time/2,0,255);
139 int pwm_l =
_constrain(val+dead_time/2,0,255);
141 analogWrite(pinH, pwm_h);
142 if(pwm_l == 255 || pwm_l == 0)
143 digitalWrite(pinL, pwm_l ? LOW : HIGH);
145 analogWrite(pinL, pwm_l);
152 void _writeDutyCycle6PWM(
float dc_a,
float dc_b,
float dc_c,
float dead_zone,
int pinA_h,
int pinA_l,
int pinB_h,
int pinB_l,
int pinC_h,
int pinC_l){
153 _setPwmPair(pinA_h, pinA_l, dc_a*255.0, dead_zone*255.0);
154 _setPwmPair(pinB_h, pinB_l, dc_b*255.0, dead_zone*255.0);
155 _setPwmPair(pinC_h, pinC_l, dc_c*255.0, dead_zone*255.0);