1#include "../../hardware_api.h"
3#if defined(__AVR_ATmega2560__) || defined(AVR_ATmega1280)
7#pragma message("SimpleFOC: compiling for Arduino/ATmega2560 or Arduino/ATmega1280")
11#define _PWM_FREQUENCY 32000
12#define _PWM_FREQUENCY_MAX 32000
13#define _PWM_FREQUENCY_MIN 4000
16void _pinHighFrequency(
const int pin,
const long frequency){
20 if(frequency >= 0.5*(_PWM_FREQUENCY_MAX-_PWM_FREQUENCY_MIN)) high_fq=
true;
24 if (pin == 13 || pin == 4 ) {
25 TCCR0A = ((TCCR0A & 0b11111100) | 0x01);
26 if(high_fq) TCCR0B = ((TCCR0B & 0b11110000) | 0x01);
27 else TCCR0B = ((TCCR0B & 0b11110000) | 0x02);
29 else if (pin == 12 || pin == 11 )
30 if(high_fq) TCCR1B = ((TCCR1B & 0b11110000) | 0x01);
31 else TCCR1B = ((TCCR1B & 0b11110000) | 0x02);
32 else if (pin == 10 || pin == 9 )
33 if(high_fq) TCCR2B = ((TCCR2B & 0b11110000) | 0x01);
34 else TCCR2B = ((TCCR2B & 0b11110000) | 0x02);
35 else if (pin == 5 || pin == 3 || pin == 2)
36 if(high_fq) TCCR3B = ((TCCR3B & 0b11110000) | 0x01);
37 else TCCR3B = ((TCCR3B & 0b11110000) | 0x02);
38 else if (pin == 8 || pin == 7 || pin == 6)
39 if(high_fq) TCCR4B = ((TCCR4B & 0b11110000) | 0x01);
40 else TCCR4B = ((TCCR4B & 0b11110000) | 0x02);
41 else if (pin == 44 || pin == 45 || pin == 46)
42 if(high_fq) TCCR5B = ((TCCR5B & 0b11110000) | 0x01);
43 else TCCR5B = ((TCCR5B & 0b11110000) | 0x02);
53 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
54 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
57 _pinHighFrequency(
pinA, pwm_frequency);
60 .pwm_frequency = pwm_frequency,
71 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
72 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
75 _pinHighFrequency(
pinA, pwm_frequency);
76 _pinHighFrequency(
pinB, pwm_frequency);
79 .pwm_frequency = pwm_frequency,
90 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
91 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
94 _pinHighFrequency(
pinA, pwm_frequency);
95 _pinHighFrequency(
pinB, pwm_frequency);
96 _pinHighFrequency(
pinC, pwm_frequency);
99 .pwm_frequency = pwm_frequency,
137 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
138 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
141 _pinHighFrequency(
pin1A,pwm_frequency);
142 _pinHighFrequency(
pin1B,pwm_frequency);
143 _pinHighFrequency(
pin2A,pwm_frequency);
144 _pinHighFrequency(
pin2B,pwm_frequency);
147 .pwm_frequency = pwm_frequency,
169int _configureComplementaryPair(
const int pinH,
const int pinL,
long frequency) {
170 bool high_fq =
false;
173 if(frequency >= 0.5*(_PWM_FREQUENCY_MAX-_PWM_FREQUENCY_MIN)) high_fq=
true;
176 if( (pinH == 4 && pinL == 13 ) || (pinH == 13 && pinL == 4 ) ){
178 TCCR0A = ((TCCR0A & 0b11111100) | 0x01);
180 if(pinH == 13 ) TCCR0A = 0b10110000 | (TCCR0A & 0b00001111) ;
181 else TCCR0A = 0b11100000 | (TCCR0A & 0b00001111) ;
183 if(high_fq) TCCR0B = ((TCCR0B & 0b11110000) | 0x01);
184 else TCCR0B = ((TCCR0B & 0b11110000) | 0x02);
185 }
else if( (pinH == 11 && pinL == 12 ) || (pinH == 12 && pinL == 11 ) ){
187 if(high_fq) TCCR1B = ((TCCR1B & 0b11110000) | 0x01);
188 else TCCR1B = ((TCCR1B & 0b11110000) | 0x02);
190 if(pinH == 11 ) TCCR1A = 0b10110000 | (TCCR1A & 0b00001111) ;
191 else TCCR1A = 0b11100000 | (TCCR1A & 0b00001111) ;
192 }
else if((pinH == 10 && pinL == 9 ) || (pinH == 9 && pinL == 10 ) ){
194 if(high_fq) TCCR2B = ((TCCR2B & 0b11110000) | 0x01);
195 else TCCR2B = ((TCCR2B & 0b11110000) | 0x02);
197 if(pinH == 10 ) TCCR2A = 0b10110000 | (TCCR2A & 0b00001111) ;
198 else TCCR2A = 0b11100000 | (TCCR2A & 0b00001111) ;
199 }
else if((pinH == 5 && pinL == 2 ) || (pinH == 2 && pinL == 5 ) ){
201 if(high_fq) TCCR3B = ((TCCR3B & 0b11110000) | 0x01);
202 else TCCR3B = ((TCCR3B & 0b11110000) | 0x02);
204 if(pinH == 5 ) TCCR3A = 0b10110000 | (TCCR3A & 0b00001111) ;
205 else TCCR3A = 0b11100000 | (TCCR3A & 0b00001111) ;
206 }
else if((pinH == 6 && pinL == 7 ) || (pinH == 7 && pinL == 6 ) ){
208 if(high_fq) TCCR4B = ((TCCR4B & 0b11110000) | 0x01);
209 else TCCR4B = ((TCCR4B & 0b11110000) | 0x02);
211 if(pinH == 6 ) TCCR4A = 0b10110000 | (TCCR4A & 0b00001111) ;
212 else TCCR4A = 0b11100000 | (TCCR4A & 0b00001111) ;
213 }
else if((pinH == 46 && pinL == 45 ) || (pinH == 45 && pinL == 46 ) ){
215 if(high_fq) TCCR5B = ((TCCR5B & 0b11110000) | 0x01);
216 else TCCR5B = ((TCCR5B & 0b11110000) | 0x02);
218 if(pinH == 46 ) TCCR5A = 0b10110000 | (TCCR5A & 0b00001111) ;
219 else TCCR5A = 0b11100000 | (TCCR5A & 0b00001111) ;
231 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
232 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
236 ret_flag += _configureComplementaryPair(
pinA_h,
pinA_l, pwm_frequency);
237 ret_flag += _configureComplementaryPair(
pinB_h,
pinB_l, pwm_frequency);
238 ret_flag += _configureComplementaryPair(
pinC_h,
pinC_l, pwm_frequency);
242 .pwm_frequency = pwm_frequency,
250void _setPwmPair(
int pinH,
int pinL,
float val,
int dead_time,
PhaseState ps)
252 int pwm_h =
_constrain(val-dead_time/2,0,255);
253 int pwm_l =
_constrain(val+dead_time/2,0,255);
257 digitalWrite(pinH, LOW);
262 digitalWrite(pinL, LOW);
264 if(pwm_l == 255 || pwm_l == 0)
265 digitalWrite(pinL, pwm_l ? LOW : HIGH);
const int const int const int pinC
GenericCurrentSenseParams * params
void * _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const int pin2A, const int pin2B)
void * _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)
void * _configure2PWM(long pwm_frequency, const int pinA, const int pinB)
void _writeDutyCycle2PWM(float dc_a, float dc_b, void *params)
void _writeDutyCycle1PWM(float dc_a, void *params)
#define SIMPLEFOC_DRIVER_INIT_FAILED
void _writeDutyCycle4PWM(float dc_1a, float dc_1b, float dc_2a, float dc_2b, void *params)
void * _configure3PWM(long pwm_frequency, const int pinA, const int pinB, const int pinC)
void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, PhaseState *phase_state, void *params)
void * _configure1PWM(long pwm_frequency, const int pinA)
void _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, void *params)
float const int const int const int pinB_h
float const int const int const int const int pinB_l
const int const int pin1B
const int const int const int pin2A
float const int const int const int const int const int pinC_h
float float PhaseState * phase_state
float const int const int const int const int const int const int pinC_l
float const int const int pinA_l
analogWrite(((GenericDriverParams *) params) ->pins[1], 255.0f *dc_b)
const int const int const int const int pin2B
#define _constrain(amt, low, high)