@@ -112,47 +112,45 @@ const Timer get_pwm_timer(const pin_t pin) {
112
112
}
113
113
114
114
void MarlinHAL::set_pwm_frequency (const pin_t pin, const uint16_t f_desired) {
115
- DEBUG_ECHOLNPGM (" set_pwm_frequency:: pin: " , pin," frequency: " , f_desired);
115
+ DEBUG_ECHOLNPGM (" set_pwm_frequency( pin= " , pin, " , freq= " , f_desired, " ) " );
116
116
const Timer timer = get_pwm_timer (pin);
117
117
if (timer.isProtected || !timer.isPWM ) return ; // Don't proceed if protected timer or not recognized
118
118
119
119
const bool is_timer2 = timer.n == 2 ;
120
120
const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF ;
121
- DEBUG_ECHOLNPGM (" maxtop: " ,maxtop);
121
+
122
+ DEBUG_ECHOLNPGM (" maxtop=" , maxtop);
123
+
122
124
uint16_t res = 0xFF ; // resolution (TOP value)
123
125
uint8_t j = CS_NONE; // prescaler index
124
126
uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
125
127
126
128
// Calculating the prescaler and resolution to use to achieve closest frequency
127
129
if (f_desired != 0 ) {
128
130
constexpr uint16_t prescaler[] = { 1 , 8 , (32 ), 64 , (128 ), 256 , 1024 }; // (*) are Timer 2 only
129
- uint16_t f = (F_CPU) / (( uint32_t ) maxtop<< 11 ) + 1 ; // Start with the lowest non-zero frequency achievable (for 16MHz, 1 or 31)
131
+ uint16_t f = (F_CPU) / (uint32_t ( maxtop) << 11 ) + 1 ; // Start with the lowest non-zero frequency achievable (for 16MHz, 1 or 31)
130
132
131
- DEBUG_ECHOLNPGM (" F: " , f);
132
- DEBUG_ECHOLNPGM (" Startloop:: " );
133
+ DEBUG_ECHOLNPGM (" f= " , f);
134
+ DEBUG_ECHOLNPGM (" (prescaler loop) " );
133
135
LOOP_L_N (i, COUNT (prescaler)) { // Loop through all prescaler values
134
136
const uint16_t p = prescaler[i];
135
- DEBUG_ECHOLNPGM (" prescaler: " , p);
137
+ DEBUG_ECHOLNPGM (" prescaler[ " , i, " ]= " , p);
136
138
uint16_t res_fast_temp, res_pc_temp;
137
139
if (is_timer2) {
138
- DEBUG_ECHOLNPGM (" Is Timer2::" );
139
140
#if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
140
141
const uint16_t rft = (F_CPU) / (p * f_desired);
141
142
res_fast_temp = rft - 1 ;
142
- DEBUG_ECHOLNPGM (" res_fast_temp: " ,res_fast_temp);
143
143
res_pc_temp = rft / 2 ;
144
- DEBUG_ECHOLNPGM (" res_pc_temp: " , res_pc_temp);
144
+ DEBUG_ECHOLNPGM (" (Timer2) res_fast_temp= " , res_fast_temp, " res_pc_temp= " , res_pc_temp);
145
145
#else
146
146
res_fast_temp = res_pc_temp = maxtop;
147
- DEBUG_ECHOLNPGM (" res_fast_temp: " ,maxtop);
148
- DEBUG_ECHOLNPGM (" res_pc_temp: " ,maxtop);
147
+ DEBUG_ECHOLNPGM (" (Timer2) res_fast_temp=" , maxtop, " res_pc_temp=" , maxtop);
149
148
#endif
150
149
}
151
150
else {
152
- DEBUG_ECHOLNPGM (" Not Timer2::" );
153
151
if (p == 32 || p == 128 ) continue ; // Skip TIMER2 specific prescalers when not TIMER2
154
152
const uint16_t rft = (F_CPU) / (p * f_desired);
155
- DEBUG_ECHOLNPGM (" F_CPU: " , STRINGIFY (F_CPU)," prescaler: " ,p, " f_desired: " , f_desired);
153
+ DEBUG_ECHOLNPGM (" (Not Timer 2) F_CPU= " STRINGIFY (F_CPU), " prescaler= " , p, " f_desired= " , f_desired);
156
154
res_fast_temp = rft - 1 ;
157
155
res_pc_temp = rft / 2 ;
158
156
}
@@ -161,33 +159,28 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
161
159
LIMIT (res_pc_temp, 1U , maxtop);
162
160
163
161
// Calculate frequencies of test prescaler and resolution values
164
- const uint16_t f_fast_temp = (F_CPU) / (( uint32_t )p * (1 + res_fast_temp)),
165
- f_pc_temp = (F_CPU) / ((( uint32_t )p * res_pc_temp)<< 1 ),
162
+ const uint16_t f_fast_temp = (F_CPU) / (uint32_t (p) * (1 + res_fast_temp)),
163
+ f_pc_temp = (F_CPU) / ((uint32_t (p) * res_pc_temp) << 1 ),
166
164
f_diff = _MAX (f, f_desired) - _MIN (f, f_desired),
167
165
f_fast_diff = _MAX (f_fast_temp, f_desired) - _MIN (f_fast_temp, f_desired),
168
166
f_pc_diff = _MAX (f_pc_temp, f_desired) - _MIN (f_pc_temp, f_desired);
169
- DEBUG_ECHOLNPGM (" f_fast_temp: " ,f_fast_temp);
170
- DEBUG_ECHOLNPGM (" f_pc_temp: " ,f_pc_temp);
171
- DEBUG_ECHOLNPGM (" f_diff: " ,f_diff);
172
- DEBUG_ECHOLNPGM (" f_fast_diff: " ,f_fast_diff);
173
- DEBUG_ECHOLNPGM (" f_pc_diff: " ,f_pc_diff);
167
+
168
+ DEBUG_ECHOLNPGM (" f_fast_temp=" , f_fast_temp, " f_pc_temp=" , f_pc_temp, " f_diff=" , f_diff, " f_fast_diff=" , f_fast_diff, " f_pc_diff=" , f_pc_diff);
174
169
175
170
if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
176
- DEBUG_ECHOLNPGM (" Using FAST::" );
177
171
// Set the Wave Generation Mode to FAST PWM
178
172
wgm = is_timer2 ? uint8_t (TERN (USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t (WGM_FAST_PWM_ICRn);
179
173
// Remember this combination
180
174
f = f_fast_temp; res = res_fast_temp; j = i + 1 ;
181
- DEBUG_ECHOLNPGM (" updated f: " , f);
175
+ DEBUG_ECHOLNPGM (" (FAST) updated f= " , f);
182
176
}
183
177
else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
184
- DEBUG_ECHOLNPGM (" Using PHASE::" );
185
178
// Set the Wave Generation Mode to PWM PHASE CORRECT
186
179
wgm = is_timer2 ? uint8_t (TERN (USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t (WGM_PWM_PC_ICRn);
187
180
f = f_pc_temp; res = res_pc_temp; j = i + 1 ;
188
- DEBUG_ECHOLNPGM (" updated f: " , f);
181
+ DEBUG_ECHOLNPGM (" (PHASE) updated f= " , f);
189
182
}
190
- }
183
+ } // prescaler loop
191
184
}
192
185
193
186
_SET_WGMnQ (timer, wgm);
0 commit comments