1#include "../../hardware_api.h"
3#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega328PB__)
6#pragma message("SimpleFOC: compiling for Arduino/ATmega328 ATmega168 ATmega328PB")
9#define _PWM_FREQUENCY 32000
10#define _PWM_FREQUENCY_MAX 32000
11#define _PWM_FREQUENCY_MIN 4000
14void _pinHighFrequency(
const int pin,
const long frequency){
18 if(frequency >= 0.5*(_PWM_FREQUENCY_MAX-_PWM_FREQUENCY_MIN)) high_fq=
true;
21 if (pin == 5 || pin == 6 ) {
22 TCCR0A = ((TCCR0A & 0b11111100) | 0x01);
23 if(high_fq) TCCR0B = ((TCCR0B & 0b11110000) | 0x01);
24 else TCCR0B = ((TCCR0B & 0b11110000) | 0x02);
25 }
else if (pin == 9 || pin == 10 ){
26 if(high_fq) TCCR1B = ((TCCR1B & 0b11110000) | 0x01);
27 else TCCR1B = ((TCCR1B & 0b11110000) | 0x02);
28 }
else if (pin == 3 || pin == 11){
29 if(high_fq) TCCR2B = ((TCCR2B & 0b11110000) | 0x01);
30 else TCCR2B = ((TCCR2B & 0b11110000) | 0x02);
35 GTCCR = (1<<TSM)|(1<<PSRASY)|(1<<PSRSYNC);
49 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
50 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
53 _pinHighFrequency(
pinA, pwm_frequency);
56 .pwm_frequency = pwm_frequency,
66 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
67 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
70 _pinHighFrequency(
pinA, pwm_frequency);
71 _pinHighFrequency(
pinB, pwm_frequency);
74 .pwm_frequency = pwm_frequency,
85 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
86 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
89 _pinHighFrequency(
pinA, pwm_frequency);
90 _pinHighFrequency(
pinB, pwm_frequency);
91 _pinHighFrequency(
pinC, pwm_frequency);
94 .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,
166int _configureComplementaryPair(
const int pinH,
const int pinL,
long frequency) {
167 bool high_fq =
false;
170 if(frequency >= 0.5*(_PWM_FREQUENCY_MAX-_PWM_FREQUENCY_MIN)) high_fq=
true;
173 if( (pinH == 5 && pinL == 6 ) || (pinH == 6 && pinL == 5 ) ){
175 TCCR0A = ((TCCR0A & 0b11111100) | 0x01);
177 if(pinH == 6 ) TCCR0A = 0b10110000 | (TCCR0A & 0b00001111) ;
178 else TCCR0A = 0b11100000 | (TCCR0A & 0b00001111) ;
180 if(high_fq) TCCR0B = ((TCCR0B & 0b11110000) | 0x01);
181 else TCCR0B = ((TCCR0B & 0b11110000) | 0x02);
182 }
else if( (pinH == 9 && pinL == 10 ) || (pinH == 10 && pinL == 9 ) ){
184 if(high_fq) TCCR1B = ((TCCR1B & 0b11110000) | 0x01);
185 else TCCR1B = ((TCCR1B & 0b11110000) | 0x02);
187 if(pinH == 9 ) TCCR1A = 0b10110000 | (TCCR1A & 0b00001111) ;
188 else TCCR1A = 0b11100000 | (TCCR1A & 0b00001111) ;
189 }
else if((pinH == 3 && pinL == 11 ) || (pinH == 11 && pinL == 3 ) ){
191 if(high_fq) TCCR2B = ((TCCR2B & 0b11110000) | 0x01);
192 else TCCR2B = ((TCCR2B & 0b11110000) | 0x02);
194 if(pinH == 11 ) TCCR2A = 0b10110000 | (TCCR2A & 0b00001111) ;
195 else TCCR2A = 0b11100000 | (TCCR2A & 0b00001111) ;
207 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
208 else pwm_frequency =
_constrain(pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
212 ret_flag += _configureComplementaryPair(
pinA_h,
pinA_l, pwm_frequency);
213 ret_flag += _configureComplementaryPair(
pinB_h,
pinB_l, pwm_frequency);
214 ret_flag += _configureComplementaryPair(
pinC_h,
pinC_l, pwm_frequency);
218 .pwm_frequency = pwm_frequency,
226void _setPwmPair(
int pinH,
int pinL,
float val,
int dead_time,
PhaseState ps)
228 int pwm_h =
_constrain(val-dead_time/2,0,255);
229 int pwm_l =
_constrain(val+dead_time/2,0,255);
233 digitalWrite(pinH, LOW);
238 digitalWrite(pinL, LOW);
240 if(pwm_l == 255 || pwm_l == 0)
241 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)