arneh schreef :
Dit komt waarschijnlijk doordat de PID-uitkomst direct als PWM wordt gebruikt, waardoor er een deadband van -155 tot 155 ontstaat. De oplossing was om eerst de I term te verhogen tot 15. Hier valt dus nog wat te verbeteren.
150 is de minimale pwm value voor een motor. (je schreef 155 maar in de laatse code is dit igg 150). Wat hij doet bij een PID uitkomst van 15 is het volgende. 15/150 * 5 (secondenn) gaat de motor aan. Dus dat is 0,5 seconden aan en dan 4,5 seconden uit. Tijdens deze 4,5 seconden kan het al zijn dat de koerswijziging effect had en de motor dan veel langer uitblijft. De motor aan/uit tijd wordt met 20Hz berekend. Er is dus geen deadband. Ik heb voor nu 5 seconden gekozen als interval tijd, maar dit zou ook nog hoger en lager kunnen.
Onderstaande stukje code vat alles samen
if (command.abs() < deadBand){
motorSpeed = 0;
}
motorSpeed = command.abs().toInt();
//DC motors do not perform well on 50% duty cycle so we are going to pulse instead.
if (motorSpeed < 150){
//calculate maximum motor on time //it will be a percentage of 5.000 seconds.
// ignore: non_constant_identifier_names
int motor_on_limit = (motorSpeed / 150 * 5000).toInt();
//print("stopwatch ${stopwatch.elapsedMilliseconds } > limit ${motor_on_limit } ");
//check if the maximum time exceeded and then stop
if(motor_running && stopwatch.elapsedMilliseconds > motor_on_limit){
motorSpeed = 0;
//print("motor stopped ${stopwatch.elapsedMilliseconds } > ${motor_on_limit } ");
}else if(!motor_running && motorSpeed > 0 && stopwatch.elapsedMilliseconds > 5000 - motor_on_limit){
//print("motor started ${stopwatch.elapsedMilliseconds } > ${5000 -motor_on_limit } ");
motorSpeed = 150;
}else{
return;
}
arneh schreef :
De IBT2 current sensor heb jij dus ook nog niet getest/gebruikt. Maar er moet nog wel iets tussen om de ESP32 niet op te blazen, waarschijnlijk iets van een voltage divider, maar daar heb ik niet echt verstand van.
Precies van Caldiris zegt. De formule is R2/(R1+R2). In zijn voorbeeld 20/30 = 0.667. Ik gebruik een 10k en 20k weerstand. Je kan ook een potmeter gebruiken.
Als je linear drive endswitches heeft, of als hij een positie sensor heeft, dan is current sensing niet nodig. In mijn hydraulisch systeem is het ook niet nodig omdat er een overdruk bypass valve in zit.