|
12 | 12 | Therefore, their executions are not blocked by bad-behaving functions / tasks. |
13 | 13 | This important feature is absolutely necessary for mission-critical tasks. |
14 | 14 |
|
15 | | - Version: 1.0.0 |
| 15 | + Version: 1.1.0 |
16 | 16 |
|
17 | 17 | Version Modified By Date Comments |
18 | 18 | ------- ----------- ---------- ----------- |
19 | 19 | 1.0.0 K.Hoang 22/09/2021 Initial coding for Portenta_H7 |
| 20 | + 1.1.0 K Hoang 10/11/2021 Add functions to modify PWM settings on-the-fly |
20 | 21 | *****************************************************************************************************************************/ |
21 | 22 |
|
22 | 23 | #pragma once |
|
44 | 45 | #endif |
45 | 46 |
|
46 | 47 | #ifndef PORTENTA_H7_SLOW_PWM_VERSION |
47 | | - #define PORTENTA_H7_SLOW_PWM_VERSION "PORTENTA_H7_SLOW_PWM v1.0.0" |
| 48 | + #define PORTENTA_H7_SLOW_PWM_VERSION "PORTENTA_H7_SLOW_PWM v1.1.0" |
48 | 49 | #endif |
49 | 50 |
|
50 | 51 | #ifndef _PWM_LOGLEVEL_ |
@@ -95,43 +96,74 @@ class Portenta_H7_Slow_PWM_ISR |
95 | 96 |
|
96 | 97 | ////////////////////////////////////////////////////////////////// |
97 | 98 | // PWM |
98 | | - void setPWM(uint32_t pin, uint32_t frequency, uint32_t dutycycle, timer_callback StartCallback = nullptr, |
| 99 | + // Return the channelNum if OK, -1 if error |
| 100 | + int setPWM(uint32_t pin, double frequency, uint32_t dutycycle, timer_callback StartCallback = nullptr, |
99 | 101 | timer_callback StopCallback = nullptr) |
| 102 | + //void setPWM(uint32_t pin, uint32_t frequency, uint32_t dutycycle, timer_callback StartCallback = nullptr, |
| 103 | + // timer_callback StopCallback = nullptr) |
100 | 104 | { |
101 | 105 | uint32_t period = 0; |
102 | 106 |
|
103 | 107 | if ( ( frequency != 0 ) && ( frequency <= 1000 ) ) |
104 | 108 | { |
105 | 109 | #if USING_MICROS_RESOLUTION |
106 | 110 | // period in us |
107 | | - period = 1000000 / frequency; |
| 111 | + period = 1000000.0f / frequency; |
108 | 112 | #else |
109 | 113 | // period in ms |
110 | | - period = 1000 / frequency; |
| 114 | + period = 1000.0f / frequency; |
111 | 115 | #endif |
112 | 116 | } |
113 | 117 | else |
114 | 118 | { |
115 | | - PWM_LOGERROR("Error: Invalid frequency, max is 500Hz"); |
| 119 | + PWM_LOGERROR("Error: Invalid frequency, max is 1000Hz"); |
| 120 | + |
| 121 | + return -1; |
116 | 122 | } |
117 | 123 |
|
118 | | - setupPWMChannel(pin, period, dutycycle, (void *) StartCallback, (void *) StopCallback); |
| 124 | + return setupPWMChannel(pin, period, dutycycle, (void *) StartCallback, (void *) StopCallback); |
119 | 125 | } |
120 | 126 |
|
121 | | -#if USING_MICROS_RESOLUTION |
122 | | - //period in us |
123 | | - void setPWM_Period(uint32_t pin, uint32_t period, uint32_t dutycycle, timer_callback StartCallback = nullptr, |
124 | | - timer_callback StopCallback = nullptr) |
125 | | -#else |
126 | | - // PWM |
127 | | - //period in ms |
128 | | - void setPWM_Period(uint32_t pin, uint32_t period, uint32_t dutycycle, timer_callback StartCallback = nullptr, |
129 | | - timer_callback StopCallback = nullptr) |
130 | | -#endif |
| 127 | + // period in us |
| 128 | + // Return the channelNum if OK, -1 if error |
| 129 | + int setPWM_Period(uint32_t pin, uint32_t period, uint32_t dutycycle, timer_callback StartCallback = nullptr, |
| 130 | + timer_callback StopCallback = nullptr) |
131 | 131 | { |
132 | | - setupPWMChannel(pin, period, dutycycle, (void *) StartCallback, (void *) StopCallback); |
| 132 | + return setupPWMChannel(pin, period, dutycycle, (void *) StartCallback, (void *) StopCallback); |
133 | 133 | } |
134 | 134 |
|
| 135 | + ////////////////////////////////////////////////////////////////// |
| 136 | + |
| 137 | + // low level function to modify a PWM channel |
| 138 | + // returns the true on success or false on failure |
| 139 | + bool modifyPWMChannel(unsigned channelNum, uint32_t pin, double frequency, uint32_t dutycycle) |
| 140 | + { |
| 141 | + uint32_t period = 0; |
| 142 | + |
| 143 | + if ( ( frequency > 0 ) && ( frequency <= 500 ) ) |
| 144 | + { |
| 145 | +#if USING_MICROS_RESOLUTION |
| 146 | + // period in us |
| 147 | + period = 1000000.0f / frequency; |
| 148 | +#else |
| 149 | + // period in ms |
| 150 | + period = 1000.0f / frequency; |
| 151 | +#endif |
| 152 | + } |
| 153 | + else |
| 154 | + { |
| 155 | + PWM_LOGERROR("Error: Invalid frequency, max is 500Hz"); |
| 156 | + return false; |
| 157 | + } |
| 158 | + |
| 159 | + return modifyPWMChannel_Period(channelNum, pin, period, dutycycle); |
| 160 | + } |
| 161 | + |
| 162 | + ////////////////////////////////////////////////////////////////// |
| 163 | + |
| 164 | + //period in us |
| 165 | + bool modifyPWMChannel_Period(unsigned channelNum, uint32_t pin, uint32_t period, uint32_t dutycycle); |
| 166 | + |
135 | 167 | ////////////////////////////////////////////////////////////////// |
136 | 168 |
|
137 | 169 | // destroy the specified PWM channel |
|
0 commit comments