MCPWM (not for motor) for 1 mhz

redowl
Posts: 5
Joined: Fri Jul 12, 2024 4:52 pm

MCPWM (not for motor) for 1 mhz

Postby redowl » Sun Oct 27, 2024 8:37 pm

mcpwm to full control a mosfet@1mhz, the bridge used in a power control a transformer 1Mhz (not khz)
the mcpwm not generate frequency to 1mhz
100khz

1mhz
for this usage 5 bit pwm
4 wire

have idea to increrase frequency to 1mhz ?

Code: Untitled.cpp Select all




#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include <iostream>
using namespace std;
#include <WString.h>
#include <Arduino.h>






#include <ArduinoJson.h>
#include "driver/uart.h"
#include "driver/temp_sensor.h"
#include "driver/gpio.h"
#include "driver/ledc.h"




#include "esp_attr.h"

#include "driver/mcpwm.h"
#include "soc/mcpwm_periph.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_err.h"
#include "SD.h"
#include "FS.h"
#include "SPI.h"


/********************************** SD **********************************************************/
#define SD_CS (GPIO_NUM_41) // SD_CS 41
#define SDMMC_CMD (GPIO_NUM_40) // SD_MOSI 40
#define SDMMC_CLK (GPIO_NUM_39) // SD_CLK 39
#define SDMMC_D0 (GPIO_NUM_38) // SD_MISO 38
uint64_t SD_CARD_INFO[5] = {0,0,0,0,0}; //type and present, size, totalbyte, used, freebyte










/** @brief ESP32 Phae-Shift-PWM Example
*
* Uses the driver for the MCPWM hardware modules on the Espressif ESP32
* or ESP32-S3 SoC for generating a Phase-Shift-PWM waveform between
* two pairs of hardware pins. (Not compatible with ESP32-S2)
*
* Application in power electronics, e.g. Zero-Voltage-Switching (ZVS)
* Full-Bridge-, Dual-Active-Bridge- and LLC converters.
*
* 2021-05-21 Ulrich Lukas
*/



#define H_BRIDGE_H0 (GPIO_NUM_20) // PWM0A
#define H_BRIDGE_L0 (GPIO_NUM_21) // PWM0B
#define H_BRIDGE_D0 (GPIO_NUM_42) // disable


#define H_BRIDGE_H1 (GPIO_NUM_35) // PWM1A
#define H_BRIDGE_L1 (GPIO_NUM_36) // PWM1B
#define H_BRIDGE_D1 (GPIO_NUM_37) // disable


#define H_BRIDGE_FREQUENCY 27000 // max frequency is 1e5 i requred 1e6
#define H_BRIDGE_PWM_BIT 10 //not used
#define H_BRIDGE_PWM_PARTIAL 33










//************************************************************
void buck_Enable(){







mcpwm_config_t pwm_config; //Timer configuration structure
pwm_config.frequency = H_BRIDGE_FREQUENCY; //frequency = 1000Hz
pwm_config.cmpr_a = 0;
pwm_config.cmpr_b = 0;
pwm_config.counter_mode = MCPWM_UP_COUNTER;
pwm_config.duty_mode = MCPWM_DUTY_MODE_0;


MCPWM0.clk_cfg.clk_prescale = ( ( ( APB_CLK_FREQ / 1000000 ) * 2 ) - 1 ); //GROUP CLOCK_IN IS 160MHz, my target is 1us x tick



MCPWM0.timer[0].timer_cfg0.timer_prescale = 4; //THIS IS NOT WORKING!!!
MCPWM0.timer[0].timer_cfg1.timer_mod = 0;
MCPWM0.timer[0].timer_cfg0.timer_period = 5;

// mcpwm_set_frequency(MCPWM_UNIT_0, MCPWM_TIMER_0,H_BRIDGE_FREQUENCY);

mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Timers 0 and 1 initialised with same setup
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_1, &pwm_config);

mcpwm_init(MCPWM_UNIT_1, MCPWM_TIMER_0, &pwm_config); //Timers 0 and 1 initialised with same setup
mcpwm_init(MCPWM_UNIT_1, MCPWM_TIMER_1, &pwm_config);


mcpwm_deadtime_enable(MCPWM_UNIT_0,MCPWM_TIMER_0,MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE,0,0); //Timer 0 deadtime setup
mcpwm_deadtime_enable(MCPWM_UNIT_0,MCPWM_TIMER_1,MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE,0,0); //Timer 1 deadtime setup

mcpwm_deadtime_enable(MCPWM_UNIT_1,MCPWM_TIMER_0,MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE,0,0); //Timer 0 deadtime setup
mcpwm_deadtime_enable(MCPWM_UNIT_1,MCPWM_TIMER_1,MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE,0,0); //Timer 1 deadtime setup


//Star using the PWM Duty values such that both driver inputs are set LOW i.e both Half bridge transistos are off
mcpwm_set_duty(MCPWM_UNIT_0,MCPWM_TIMER_0,MCPWM_GEN_A,0); //set to 0%
mcpwm_set_duty(MCPWM_UNIT_0,MCPWM_TIMER_1,MCPWM_GEN_A,100); //start up set to 100% PWM

mcpwm_set_duty(MCPWM_UNIT_1,MCPWM_TIMER_0,MCPWM_GEN_A,0); //set to 0%
mcpwm_set_duty(MCPWM_UNIT_1,MCPWM_TIMER_1,MCPWM_GEN_A,100); //start up set to 100% PWM




//Sync all timers. Generate a sync output of timer0 by invoking mcpwm_set_timer_sync_output()
//and selecting desired event to generate sync output from:-
mcpwm_set_timer_sync_output(MCPWM_UNIT_0, MCPWM_TIMER_0,MCPWM_SWSYNC_SOURCE_TEZ); //'MCPWM_SWSYNC_SOURCE_TEZ' = the sync signal is generated when Timer0 counts to zero

//Sync all timers
mcpwm_sync_enable(MCPWM_UNIT_0, MCPWM_TIMER_0,MCPWM_SELECT_TIMER0_SYNC, 0); // sync source is from TIMER_0
mcpwm_sync_enable(MCPWM_UNIT_0, MCPWM_TIMER_1,MCPWM_SELECT_TIMER0_SYNC, 0); //creates 2nd phase on Pin13, a full cycle is 1000
// mcpwm_sync_enable(MCPWM_UNIT_1, MCPWM_TIMER_0,MCPWM_SELECT_TIMER0_SYNC, 500); //creates 3rd phase on Pin14,
// mcpwm_sync_enable(MCPWM_UNIT_1, MCPWM_TIMER_1,MCPWM_SELECT_TIMER0_SYNC, 500); //creates 3rd phase on Pin14,

mcpwm_set_timer_sync_output(MCPWM_UNIT_1, MCPWM_TIMER_0,MCPWM_SWSYNC_SOURCE_TEZ);
mcpwm_sync_enable(MCPWM_UNIT_1, MCPWM_TIMER_0,MCPWM_SELECT_TIMER0_SYNC, 0);
mcpwm_sync_enable(MCPWM_UNIT_1, MCPWM_TIMER_1,MCPWM_SELECT_TIMER0_SYNC, 0);

mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, H_BRIDGE_H0); // PWM generation commences following init commands
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM1B, H_BRIDGE_L0);

mcpwm_gpio_init(MCPWM_UNIT_1, MCPWM0A, H_BRIDGE_H1); // PWM generation commences following init commands
mcpwm_gpio_init(MCPWM_UNIT_1, MCPWM1B, H_BRIDGE_L1);

/*
mcpwm_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); //Saw comments that stop-start is recommended but doesnt seem to be needed??
// vTaskDelay(pdMS_TO_TICKS(10));
mcpwm_start(MCPWM_UNIT_0, MCPWM_TIMER_0); //give a clean cycle start to PWM generator, no part duty waveforms

mcpwm_stop(MCPWM_UNIT_0, MCPWM_TIMER_1);
// vTaskDelay(pdMS_TO_TICKS(10));
mcpwm_start(MCPWM_UNIT_0, MCPWM_TIMER_1);
*/

// digitalWrite(GPIO_TOGGLE_OUT, HIGH); //Toggle a pin..for scope diagnostic purposes

}

//****************************************************************
void Set_PWM(float duty){
if(duty>4){
mcpwm_set_duty(MCPWM_UNIT_0,MCPWM_TIMER_0,MCPWM_GEN_A,duty);
mcpwm_set_duty(MCPWM_UNIT_0,MCPWM_TIMER_1,MCPWM_GEN_A,duty);

mcpwm_set_duty(MCPWM_UNIT_1,MCPWM_TIMER_0,MCPWM_GEN_A,duty);
mcpwm_set_duty(MCPWM_UNIT_1,MCPWM_TIMER_1,MCPWM_GEN_A,duty);
}
else{ //Disable the driver inputs by setting both inputs LOW
mcpwm_set_duty(MCPWM_UNIT_0,MCPWM_TIMER_0,MCPWM_GEN_A,0); //0%PWM = A LOW
mcpwm_set_duty(MCPWM_UNIT_0,MCPWM_TIMER_1,MCPWM_GEN_A,100); //100% PWM, B compliment = LOW

mcpwm_set_duty(MCPWM_UNIT_1,MCPWM_TIMER_0,MCPWM_GEN_A,0); //0%PWM = A LOW
mcpwm_set_duty(MCPWM_UNIT_1,MCPWM_TIMER_1,MCPWM_GEN_A,100); //100% PWM, B compliment = LOW
}
}
//*****************************************************************

void setup() {
pinMode(H_BRIDGE_D1, OUTPUT); // sets the digital pin 13 as output
digitalWrite(H_BRIDGE_D1, HIGH); // sets the status monitor pin low
pinMode(H_BRIDGE_D0, OUTPUT); // sets the digital pin 13 as output
digitalWrite(H_BRIDGE_D0, HIGH); // sets the status monitor pin low


buck_Enable();
Set_PWM(H_BRIDGE_PWM_PARTIAL);
delay(500);
digitalWrite(H_BRIDGE_D0,LOW); // sets the status monitor pin low
digitalWrite(H_BRIDGE_D1,LOW); // sets the status monitor pin low



}

//**********************************************************************
void loop(){



}

redowl
Posts: 5
Joined: Fri Jul 12, 2024 4:52 pm

Re: MCPWM (not for motor) for 1 Mhz or 1hz

Postby redowl » Thu Oct 31, 2024 12:59 pm

generate 1hz

Code: Untitled.cpp Select all




#define H_BRIDGE_FREQUENCY 1
#define H_BRIDGE_PWM_PARTIAL 50
#define NW_RESOLUTION 1e3 // porto la risoluzione dei bit da 1e3 a (1hz)
generate 1Mhz

Code: Untitled.cpp Select all



#define H_BRIDGE_FREQUENCY 1e6
#define H_BRIDGE_PWM_PARTIAL 50
#define NW_RESOLUTION 1e8 // porto la risoluzione dei bit da 1e8 a (1Mhz)

Code: Untitled.cpp Select all


void buck_Enable(){

//configures two MCPWM Operators to create complimentary PWM signals with a set dead time on rising edges...

mcpwm_timer_set_resolution(MCPWM_UNIT_0, MCPWM_TIMER_0, NW_RESOLUTION);
mcpwm_timer_set_resolution(MCPWM_UNIT_1, MCPWM_TIMER_1, NW_RESOLUTION); //Found necessary to apply this to all timers
mcpwm_group_set_resolution(MCPWM_UNIT_0, NW_RESOLUTION);
mcpwm_group_set_resolution(MCPWM_UNIT_1, NW_RESOLUTION);

.....

Who is online

Users browsing this forum: Bytespider and 3 guests