I'm tryng to make a DC motor into a servo motor. The motor axle has a gear that is in sync with a gear on a potentiometer (MOTORPOT in the code) and I have another potentiometer that works as an input that the motor potentiometer should match in position however I set this pot(CONTROLPOT in code). Right now the motor doesn't turn for testing purposes and im moving the motor pot myself. I'm getting really odd results, I have two LED's to tell me which condition is active but they both behave in a way I can't explain, sometimes they are on but dim or one is one and fully bright. The LED's arent signalling the right condition when they are supposed to, even when both potentiometers are in the same position. I dont want to make this an XY problem but here are some reasons why I think it might be the case but have no idea how to fix.
Can someone please help me fix the code to make the two leds turn on when the value of the motor potentiometer is the same is as the control potentiometer within +/- the error value but also account for the fact the motor has to turn clockwise/anti depending on the direction of turn to get to the desired value as I've tried to do already.
- I'm using a wrong method of getting potentiometer values from ADC?
- There's something wrong with the conditions?
C:
while(1){
// MOTOR POT ADC CONVERSION
ADPCH = 0b00001111; // MOTOR POT PORT
ADCON0bits.GO = 1;
while (ADCON0bits.GO);
MOTORPOT = ADRES;
// CONTROL POT ADC CONVERSION
ADPCH = 0b00001110; // CONTROL POT PORT
ADCON0bits.GO = 1;
while (ADCON0bits.GO);
CONTROLPOT = ADRES;
MOTORPOT = mapVal(MOTORPOT,0 ,4096,0,200); // 200 steps
CONTROLPOT = mapVal(CONTROLPOT,0 ,4096,0,200);
if(MOTORPOT < CONTROLPOT - ERROR){
RA2PPS = 0b00001001; // Route PWM Output to MOTOR IN1
PORTAbits.RA4 = 0; // Set IN2 Low
CCPR1 = 150; // PWM Speed
PORTBbits.RB4 = 1; // Set Test LED A
PORTBbits.RB5 = 0; // Clear Test LED B
}
if(MOTORPOT > CONTROLPOT + ERROR){
RA4PPS = 0b00001001; // Route PWM Output to MOTOR IN2
PORTAbits.RA2 = 0; // Set IN1 Low
CCPR1 = 150; // PWM Speed
PORTBbits.RB5 = 1; // Set Test LED B
PORTBbits.RB4 = 0; // Clear Test LED A
}
if((MOTORPOT < CONTROLPOT + ERROR) &&(MOTORPOT > CONTROLPOT - ERROR)){
CCPR1 = 0; // Set PWM Speed to 0
PORTBbits.RB5 = 1; // Set Test LED A
PORTBbits.RB4 = 1; // Set Test LED B
}
}