SimpleFOClibrary 2.4.0
Loading...
Searching...
No Matches
drivers/hardware_specific/teensy/teensy_mcu.cpp
Go to the documentation of this file.
1#include "teensy_mcu.h"
2
3#if defined(__arm__) && defined(CORE_TEENSY)
4
5#include "../../../communication/SimpleFOCDebug.h"
6
7// configure High PWM frequency
8void _setHighFrequency(const long freq, const int pin){
9 analogWrite(pin, 0);
10 analogWriteFrequency(pin, freq);
11}
12
13
14// function setting the high pwm frequency to the supplied pins
15// - Stepper motor - 2PWM setting
16// - hardware specific
17void* _configure1PWM(long pwm_frequency, const int pinA) {
18 if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
19 else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
20 _setHighFrequency(pwm_frequency, pinA);
21 TeensyDriverParams* params = new TeensyDriverParams {
22 .pins = { pinA },
23 .pwm_frequency = pwm_frequency,
24 .additional_params = nullptr
25 };
26 return params;
27}
28
29
30// function setting the high pwm frequency to the supplied pins
31// - Stepper motor - 2PWM setting
32// - hardware specific
33void* _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
34 if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
35 else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
36 _setHighFrequency(pwm_frequency, pinA);
37 _setHighFrequency(pwm_frequency, pinB);
38 TeensyDriverParams* params = new TeensyDriverParams {
39 .pins = { pinA, pinB },
40 .pwm_frequency = pwm_frequency,
41 .additional_params = nullptr
42 };
43 return params;
44}
45
46// inital weak implementation of the center aligned 3pwm configuration
47// teensy 4 and 3 have center aligned pwm
48__attribute__((weak)) void* _configureCenterAligned3PMW(long pwm_frequency, const int pinA, const int pinB, const int pinC) {
50}
51
52// function setting the high pwm frequency to the supplied pins
53// - BLDC motor - 3PWM setting
54// - hardware specific
55void* _configure3PWM(long pwm_frequency,const int pinA, const int pinB, const int pinC) {
56 if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
57 else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
58
59 // try configuring center aligned pwm
60 void* p = _configureCenterAligned3PMW(pwm_frequency, pinA, pinB, pinC);
62 return p; // if center aligned pwm is available return the params
63 }else{ // if center aligned pwm is not available use fast pwm
64 SIMPLEFOC_DEBUG("TEENSY-DRV: Configuring 3PWM with fast pwm. Please consider using center aligned pwm for better performance!");
65 _setHighFrequency(pwm_frequency, pinA);
66 _setHighFrequency(pwm_frequency, pinB);
67 _setHighFrequency(pwm_frequency, pinC);
68 TeensyDriverParams* params = new TeensyDriverParams {
69 .pins = { pinA, pinB, pinC },
70 .pwm_frequency = pwm_frequency,
71 .additional_params = nullptr
72 };
73 return params;
74 }
75}
76
77// function setting the high pwm frequency to the supplied pins
78// - Stepper motor - 4PWM setting
79// - hardware specific
80void* _configure4PWM(long pwm_frequency, const int pinA, const int pinB, const int pinC, const int pinD) {
81 if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
82 else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
83 _setHighFrequency(pwm_frequency, pinA);
84 _setHighFrequency(pwm_frequency, pinB);
85 _setHighFrequency(pwm_frequency, pinC);
86 _setHighFrequency(pwm_frequency, pinD);
87 TeensyDriverParams* params = new TeensyDriverParams {
88 .pins = { pinA, pinB, pinC, pinD },
89 .pwm_frequency = pwm_frequency,
90 .additional_params = nullptr
91 };
92 return params;
93}
94
95
96// function setting the pwm duty cycle to the hardware
97// - Stepper motor - 2PWM setting
98// - hardware specific
99void _writeDutyCycle1PWM(float dc_a, void* params) {
100 // transform duty cycle from [0,1] to [0,255]
101 analogWrite(((TeensyDriverParams*)params)->pins[0], 255.0f*dc_a);
102}
103
104
105// function setting the pwm duty cycle to the hardware
106// - Stepper motor - 2PWM setting
107// - hardware specific
108void _writeDutyCycle2PWM(float dc_a, float dc_b, void* params) {
109 // transform duty cycle from [0,1] to [0,255]
110 analogWrite(((TeensyDriverParams*)params)->pins[0], 255.0f*dc_a);
111 analogWrite(((TeensyDriverParams*)params)->pins[1], 255.0f*dc_b);
112}
113
114// inital weak implementation of the center aligned 3pwm configuration
115// teensy 4 and 3 have center aligned pwm implementation of this function
116__attribute__((weak)) void _writeCenterAligned3PMW(float dc_a, float dc_b, float dc_c, void* params){
117 _UNUSED(dc_a);
118 _UNUSED(dc_b);
119 _UNUSED(dc_c);
121}
122
123
124// function setting the pwm duty cycle to the hardware
125// - BLDC motor - 3PWM setting
126// - hardware specific
127void _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, void* params){
128
129 TeensyDriverParams* p = (TeensyDriverParams*)params;
130 if(p->additional_params != nullptr){
131 _writeCenterAligned3PMW(dc_a, dc_b, dc_c, p);
132 }else{
133 // transform duty cycle from [0,1] to [0,255]
134 analogWrite(p->pins[0], 255.0f*dc_a);
135 analogWrite(p->pins[1], 255.0f*dc_b);
136 analogWrite(p->pins[2], 255.0f*dc_c);
137 }
138}
139
140// function setting the pwm duty cycle to the hardware
141// - Stepper motor - 4PWM setting
142// - hardware specific
143void _writeDutyCycle4PWM(float dc_1a, float dc_1b, float dc_2a, float dc_2b, void* params){
144 // transform duty cycle from [0,1] to [0,255]
145 analogWrite(((TeensyDriverParams*)params)->pins[0], 255.0f*dc_1a);
146 analogWrite(((TeensyDriverParams*)params)->pins[1], 255.0f*dc_1b);
147 analogWrite(((TeensyDriverParams*)params)->pins[2], 255.0f*dc_2a);
148 analogWrite(((TeensyDriverParams*)params)->pins[3], 255.0f*dc_2b);
149}
150
151#endif
#define SIMPLEFOC_DEBUG(msg,...)
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 * _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 * _configure1PWM(long pwm_frequency, const int pinA)
void _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, void *params)
float float float dc_2b
analogWrite(((GenericDriverParams *) params) ->pins[1], 255.0f *dc_b)
__attribute__((weak)) float _sin(float a)
Definition foc_utils.cpp:7
#define _UNUSED(v)
Definition foc_utils.h:14
#define _isset(a)
Definition foc_utils.h:13
#define _constrain(amt, low, high)
Definition foc_utils.h:11