!!!! Mit Sicherheit!!!! ich habe das falsch interpretiert! " mcpwm_capture_signal_get_value() hier ist doch die Zeitdauer gemeint und der Rückgabewert ist nicht der Wert des ADC´s sondern eine Zeitangabe
und ich versuche schon seit stunden den Fehler zu finden!
Also Ladesteuerung für E-Fahrzeug und damit die Überwachung des CP (Control Pilot) Signals.
Wie machst Du die Umsetzung der +12V und -12V Signale auf den analogen Eingang?
Nur mit Diode abschneiden?
Möglichkeit mit 3 Widerständen:
Damit geht es.
Zum Messen eventuell PWM Signal auf RC Tief-Pass Filter geben, am Ausgang hat man dann fast Gleichspannung. Zwar reagiert Dein Kontroller dann minimal zeitverzögert, aber das sollte kein Problem sein. Das Ladegerät befindet sich ja sowieso im Fahrzeug.
Wichtig wäre nur die Pulsweite Deines PWM Signals und der Widerstand am PP Anschluss, damit das Kabel nicht überlastet wird.
Gruß, Jürgen
Hy,
ich komme erst jetzt wieder dazu.....
Wie machst Du die Umsetzung der +12V und -12V Signale auf den analogen Eingang?
Nur mit Diode abschneiden?
mit einer 2ten Spannungsquelle und widerständen. Funktioniert bis dato wunderbar.
aber eine Hardwareänderung ist leider nicht mehr drin.
Hallo,
ich habe mich jetzt sehr intensiv damit befasst jedoch stürzt mein ESP32 dennoch immer wieder ab beim versuch in einer Interrupt Rutine mit analogRead() oder auch adc1_get_raw() den analogen wert von einem GPIO zu lesen sobald man sich via Webbrowser einfach nur mit dem Webinterfache verbinden möchte. Ist in der Interrupt Routine keine Funktion zum Lesen eines GPIO läuft das System so stabil.
Das ganze läuft bei mir in einer FreeRTOS Umgebung ich habe mit besten wissen und gewissen meinen Interrupt Aufruf geschützt.
Hier mal CodeSchnipsel meines Task mit der Interrupt Routine:
#include <driver/adc.h>
#include <driver/mcpwm.h>
#include <esp_adc_cal.h>
#include <soc/mcpwm_reg.h>
#include <soc/mcpwm_struct.h>
#include <driver/gpio.h>
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
// PWM
#define PWM1_Ch 0
#define PWM1_Res 10 // 10 bits = 1024 levels = 0,05859375A per step
#define PWM1_Freq 1000 // 980 - 1020 range, 1000 nominal
int PWM1_DutyCycle = 1000; // 0= -12V 1000= 12V
// ADC-Kanal für die Verwendung definieren
#define ADC1_GPIO35_CHANNEL ADC1_CHANNEL_7
#define ADC_CHANNEL ADC1_CHANNEL_7
#define ADC_WIDTH ADC_WIDTH_BIT_12
#define ADC_ATTEN ADC_ATTEN_DB_11
#define ADC_VREF 1100
static DRAM_ATTR uint32_t adcRead;
static DRAM_ATTR uint32_t adcRawVal;
static DRAM_ATTR esp_adc_cal_characteristics_t adc_chars;
void IRAM_ATTR pwmHigh(void *)
{
portENTER_CRITICAL_ISR(&timerMux);
iramAct = 1;
//adcRead = analogReadMilliVolts(35);
// ADC-Messwert abfragen
// adcRawVal = analogReadMilliVolts(35);
// Berechnen des Spannungswerts aus dem ADC-Messwert
//adcRead = esp_adc_cal_raw_to_voltage(adcRawVal, &adc_chars);
}
gpio_intr_disable((gpio_num_t)13);
portEXIT_CRITICAL_ISR(&timerMux);
}
void TaskCP(void*) {
VOID SETUP() { ////////////////////////////////////////// SETUP //////////////////////////////////////////
// Initialisieren Sie den ADC-Kanal
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_GPIO35_CHANNEL, ADC_ATTEN_DB_11);
esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN, ADC_WIDTH, ADC_VREF, &adc_chars);
//######################### PWM Signal mit MCPWM
// Hier kann man die Pin-Belegung für PWM und ADC festlegen
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, CTRL_PILOT);
// Hier wird der PWM-Signalgenerator konfiguriert
mcpwm_config_t pwm_config;
pwm_config.frequency = 1000; // 1kHz
pwm_config.cmpr_a = 50; // Duty-Cycle von 50%
pwm_config.counter_mode = MCPWM_UP_COUNTER;
pwm_config.duty_mode = MCPWM_DUTY_MODE_0;
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config);
// Konfigurieren des GPIO-Interrupts
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_POSEDGE;
io_conf.pin_bit_mask = 1ULL << 13;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_config(&io_conf);
// Registrieren der ISR-Funktion (Interrupt Service Routine)
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
gpio_isr_handler_add((gpio_num_t)13, pwmHigh, NULL);
// Starten des PWM-Signals
mcpwm_start(MCPWM_UNIT_0, MCPWM_TIMER_0);
}
VOID LOOP() { ////////////////////////////////////////// LOOP //////////////////////////////////////////
// Ansteuerung PWM
PWM1_DutyCycle = preferences.getShort("maxGridCurr", 0)*10;
mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, PWM1_DutyCycle);
if (iramAct > 0) {
iramCnt++;
}
if (iramCnt > 10) {
iramCnt = 0;
iramAct = 0;
gpio_intr_enable((gpio_num_t)13);
}
DELAY(10); //time for another task run.
}
}
Ich komme hier nicht mehr weiter. Hat jemand Erfahrung mit RTOS und Interrupt zum lesen von einem GPIO?
gibt es wo ein Musterbeispiel oder was fällt euch auf was ich gänzlich übersehe.
Bitte um Unterstützung.
Vielen DANK!
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.

