Skip to content
This repository was archived by the owner on Feb 28, 2024. It is now read-only.

Commit 9988510

Browse files
authored
Added PWM pulse management
Added PWM pulse management Fixed PWM behavior, now it is possible to change on run PWM duty cycle
1 parent 9c51c7e commit 9988510

File tree

1 file changed

+78
-23
lines changed

1 file changed

+78
-23
lines changed

src/AutomationCarrier.h

Lines changed: 78 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -198,55 +198,108 @@ class AnalogOutPWMClass {
198198
public:
199199
AnalogOutPWMClass() {
200200
GPIO_InitTypeDef GPIO_InitStruct;
201-
/*##-1- Enable peripherals and GPIO Clocks #################################*/
202-
/* HRTIM1 Peripheral clock enable */
201+
202+
// Enables peripherals and GPIO Clocks HRTIM1 Peripheral clock enable
203203
__HAL_RCC_HRTIM1_CLK_ENABLE();
204204

205-
/* Enable GPIO Channels Clock */
205+
// Enable GPIO Channels Clock
206206
__HAL_RCC_GPIOG_CLK_ENABLE();
207207

208-
/* Configure HRTIMA TIMA TA1/A2, TIMB TB1/2, TIMC TC1/2, TIMD TD1/2 and TIME TE1.2
209-
channels as alternate function mode */
210-
/* Common configuration for all channels */
208+
// Configure HRTIMA TIMA TA1/A2, TIMB TB1/2, TIMC TC1/2, TIMD TD1/2 and TIME TE1.2
209+
// channels as alternate function mode
210+
211211
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
212212
GPIO_InitStruct.Pull = GPIO_PULLUP;
213213
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
214214
GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1;
215215
GPIO_InitStruct.Pin = GPIO_PIN_7;
216216
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
217217

218-
/*##-1- Configure the HRTIM peripheral ######################################################*/
219-
/* Initialize the HRTIM structure */
218+
// Configure the HRTIM peripheral
219+
// Initialize the HRTIM structure
220220
HrtimHandle.Instance = HRTIM1;
221221
HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
222222
HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
223223

224224
HAL_HRTIM_Init(&HrtimHandle);
225+
226+
// Configure the HRTIM TIME PWM channels 2
227+
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
228+
sConfig_time_base.Period = 100;
229+
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
230+
sConfig_time_base.RepetitionCounter = 0;
231+
232+
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base);
233+
234+
sConfig_timerE.DMARequests = HRTIM_TIM_DMA_NONE;
235+
sConfig_timerE.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
236+
sConfig_timerE.StartOnSync = HRTIM_SYNCSTART_DISABLED;
237+
sConfig_timerE.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
238+
sConfig_timerE.DACSynchro = HRTIM_DACSYNC_NONE;
239+
sConfig_timerE.PreloadEnable = HRTIM_PRELOAD_ENABLED;
240+
sConfig_timerE.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
241+
sConfig_timerE.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
242+
sConfig_timerE.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
243+
sConfig_timerE.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
244+
sConfig_timerE.InterruptRequests = HRTIM_TIM_IT_NONE;
245+
sConfig_timerE.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
246+
sConfig_timerE.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
247+
sConfig_timerE.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
248+
sConfig_timerE.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
249+
sConfig_timerE.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED;
250+
sConfig_timerE.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;
251+
sConfig_timerE.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
252+
253+
HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,&sConfig_timerE);
254+
255+
sConfig_compare.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
256+
sConfig_compare.AutoDelayedTimeout = 0;
257+
sConfig_compare.CompareValue = 1;
258+
259+
HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_2, &sConfig_compare);
260+
261+
sConfig_output_config.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
262+
sConfig_output_config.SetSource = HRTIM_OUTPUTRESET_TIMCMP2;
263+
sConfig_output_config.ResetSource = HRTIM_OUTPUTSET_TIMPER;
264+
sConfig_output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
265+
sConfig_output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
266+
sConfig_output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
267+
sConfig_output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
268+
sConfig_output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
269+
sConfig_output_config.ResetSource = HRTIM_OUTPUTRESET_TIMPER;
270+
sConfig_output_config.SetSource = HRTIM_OUTPUTSET_TIMCMP2;
271+
272+
HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE2, &sConfig_output_config);
273+
274+
// Start PWM signals generation
275+
if (HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TE2) != HAL_OK)
276+
{
277+
// PWM Generation Error
278+
}
279+
280+
// Start HRTIM counter
281+
if (HAL_HRTIM_WaveformCounterStart(&HrtimHandle, HRTIM_TIMERID_TIMER_E) != HAL_OK)
282+
{
283+
// PWM Generation Error
284+
}
225285
}
226286

227287
~AnalogOutPWMClass(){}
228-
// TODO: check why chamnge PrescalerRatio broke the portenta
229288
void period_ms(int period) {
230-
231289
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
232-
sConfig_time_base.Period = 100;
290+
sConfig_time_base.Period = period;
233291
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
234292
sConfig_time_base.RepetitionCounter = 0;
235293

236294
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base);
237295
}
238296

239297
bool write(uint8_t voltage) {
240-
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
241-
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
242-
sConfig_Channel.Pulse = voltage*10;
243-
244-
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
245-
HRTIM_OUTPUT_TE2, &sConfig_Channel);
246-
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE2) != HAL_OK)
298+
sConfig_compare.CompareValue = voltage;
299+
if (HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_2, &sConfig_compare) != HAL_OK)
247300
{
248301
return false;
249-
}
302+
}
250303
return true;
251304
}
252305

@@ -262,7 +315,9 @@ class AnalogOutPWMClass {
262315
HRTIM_HandleTypeDef HrtimHandle;
263316

264317
HRTIM_TimeBaseCfgTypeDef sConfig_time_base;
265-
HRTIM_SimplePWMChannelCfgTypeDef sConfig_Channel;
318+
HRTIM_TimerCfgTypeDef sConfig_timerE;
319+
HRTIM_OutputCfgTypeDef sConfig_output_config;
320+
HRTIM_CompareCfgTypeDef sConfig_compare;
266321
};
267322

268323

@@ -271,13 +326,13 @@ extern AnalogOutPWMClass analopwm;
271326

272327
class AnalogOutClass {
273328
public:
274-
void write(int index, uint8_t voltage) {
329+
void write(int index, float voltage) {
275330
switch (index) {
276331
case 0:
277332
out_0.write(voltage / 10.568);
278333
break;
279334
case 1:
280-
out_1.write(voltage);
335+
out_1.write((voltage*9.3679) +1);
281336
break;
282337
case 2:
283338
out_2.write(voltage / 10.568);
@@ -290,7 +345,7 @@ class AnalogOutClass {
290345
out_0.period_ms(period);
291346
break;
292347
case 1:
293-
out_1.period_ms(period);
348+
out_1.period_ms((period/4)*100);
294349
break;
295350
case 2:
296351
out_2.period_ms(period);

0 commit comments

Comments
 (0)