Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
12 years, 8 months ago. This question has been closed. Reason: Duplicate of existing question.
Problems with PWM for sensors and motors
Hi
I am trying to implement a line following PID algorithm into my robot based on LPC1768. I am using PWM for motors and for LED intensity for sensors. However, I am experiencing problems with making both working at the same time. When the motor is on there are no readings from sensors. The pulses are both are the same. Could it the problem with my code? In my main I am assigning the return value from readSensors() function into s and then it is used to calculate PID.
The problem is I have no idea why I can't have both sensors and motors working at the same time. If you could give me any help it would be great. i know the code is big, but function readSensors works perfectly on its own same applies to motors.
#include "mbed.h"
//------MOTOR----------
I2C i2c(p9, p10); // sda, scl
PwmOut pwm0(p22);
PwmOut pwm1(p23);
const int addr = 0x40; // define the I2C Address
int fast = 7000; // fast speed
int medium = 6300; // Normal Speed Motor
int mediumFast = 5300; // Slow Speed Motor
int superslow = 8000;
float pid = 0;
//---Timer---
Timer timer;
//----COmmand Definition-----------
unsigned int FORWARD = 0x66;
unsigned int RIGHT = 0x55;
unsigned int LEFT = 0xAA;
//-----------Error for eacj position===========
int Sensor_Value0 = 0;
int Sensor_Value1 = 0;
int Sensor_Value2 = 0;
int Sensor_Value3 = 0;
int Sensor_Value4 = 0;
int Sensor_Value5 = 0;
int Sensor_Value6 = 0;
int Sensor_Value7 = 0;
//-------------------------------------------
float Sensor_High[8];
float Sensor_Low[8];
float Sensor_Value[8];
//Definition for positions
float HardRight = -0.5;
float Right = -0.25;
float Centre = 0;
float Left = 0.25;
float HardLeft = 0.5;
//-----Output for fuzzy logic----
//GLOBALS FOR PID
int position;
float targetPosition = 0; //desired setpoint
float error; //calculated error
float lastError = 0;
//-----------LINE SENSOR--------------------
DigitalOut led(LED1); // status LED
DigitalOut test(p27); // test pin
DigitalInOut ir_rx0(p11); // IR recieves
DigitalInOut ir_rx1(p12); // IR recieves
DigitalInOut ir_rx2(p15); // IR recieves
DigitalInOut ir_rx3(p16); // IR recieves
DigitalInOut ir_rx4(p17); // IR recieves
DigitalInOut ir_rx5(p18); // IR recieves
DigitalInOut ir_rx6(p25); // IR recieves
DigitalInOut ir_rx7(p26); // IR recieves
PwmOut ir_tx(p24); // IR transmitter
Serial pc(USBTX, USBRX); // USB serial port
// Black : 4.2x200us = 840us
// White : 2 x 100us = 200us
// Silver : 1.2 x 100us = 120us
float s;
float control;
float readSensors();
float PID(float output);
int main() {
char cmd[2];
pwm0.period_ms(20);
pwm1.period_ms(20);
pwm0.pulsewidth_us(superslow);
pwm1.pulsewidth_us(superslow);
while(1)
{
s = readSensors();
control = PID(s);
pwm0 = 0.35 -control; //left
pwm1 = 0.35 + pid;
cmd[0] = FORWARD;
cmd[1] = 0x00;
i2c.write(addr, cmd, 1);
}
}
float readSensors() {
float output;
int ir_value[8];
bool ir_set[8];
int ir_buffer;
int i, j, k;
ir_tx.period_ms(20); // a 20ms period
ir_tx.pulsewidth_ms(20); //
led = 1;
test = 0;
while(true)
{ //BASE Speed for motor
ir_rx0.output();
ir_rx1.output();
ir_rx2.output();
ir_rx3.output();
ir_rx4.output();
ir_rx5.output();
ir_rx6.output();
ir_rx7.output();
ir_rx0 = 1;
ir_rx1 = 1;
ir_rx2 = 1;
ir_rx3 = 1;
ir_rx4 = 1;
ir_rx5 = 1;
ir_rx6 = 1;
ir_rx7 = 1;
for(i=0; i<8; i++)
{
ir_set[i]=true;
ir_value[i]=0;
}
wait_us(50);
ir_rx0.input();
ir_rx1.input();
ir_rx2.input();
ir_rx3.input();
ir_rx4.input();
ir_rx5.input();
ir_rx6.input();
ir_rx7.input();
test = 1;
//Assigining a value from 0 to 20 to each sensor the minimum determines the strength
for(i=0; i<20; i++)
{
wait_us(50);
if ((ir_buffer && 0x01) == 0)
test = 0;
if((ir_rx0==0) & ir_set[0])
{
ir_set[0]=false; ir_value[0]=i;
}
if((ir_rx1==0) & ir_set[1])
{
ir_set[1]=false; ir_value[1]=i;
}
if((ir_rx2==0) & ir_set[2])
{
ir_set[2]=false; ir_value[2]=i;
}
if((ir_rx3==0) & ir_set[3])
{
ir_set[3]=false; ir_value[3]=i;
}
if((ir_rx4==0) & ir_set[4])
{
ir_set[4]=false; ir_value[4]=i;
}
if((ir_rx5==0) & ir_set[5])
{
ir_set[5]=false; ir_value[5]=i;
}
if((ir_rx6==0) & ir_set[6])
{
ir_set[6]=false; ir_value[6]=i;
}
if((ir_rx7==0) & ir_set[7])
{
ir_set[7]=false; ir_value[7]=i;
}
}
Sensor_Value[0] = ((15 - ir_value[0])*0.016666666667);
//printf( "SENSOR 0 VALUE = %f\n", Sensor_Value[0]);
if(Sensor_Value[0] < 0)
{
Sensor_Value[0] = 0;
}
else {
}
Sensor_Value[0] = ((15 - ir_value[0])*0.016666666667);
Sensor_Value[2] = ((14 - ir_value[2])*0.0125);
if(Sensor_Value[2] < 0)
{
Sensor_Value[2] = 0;
}
else {
Sensor_Value[2] = ((14 - ir_value[2])*0.0125);
}
printf( "SEN2 VAL:= %f\n", Sensor_Value[2]);
Sensor_Value[3] = (14 - ir_value[3])*0.020;
if(Sensor_Value[3] < 0)
{
Sensor_Value[3] = 0;
}
else {
Sensor_Value[3] = (14 - ir_value[3])*0.020;
}
printf( "SEN3 VAL:= %f\n", Sensor_Value[3]);
Sensor_Value[4]= (14 - ir_value[4])*0.020;
printf( "SEN4 VAL:= %f\n", Sensor_Value[4]);
Sensor_Value[5] = (14 - ir_value[5])*0.0125;
printf( "SEN5 VAL:= %f\n", Sensor_Value[5]);
Sensor_Value[7] = (14 - ir_value[7])*0.0125;
printf( "SEN7 VAL:= %f\n", Sensor_Value[7]);
output = (Sensor_Value[0]*HardRight)+(Sensor_Value[2]*Right)+(Sensor_Value[3]*Centre)+(Sensor_Value[5]*Left)+(Sensor_Value[7]*HardLeft);
output = output/(Sensor_Value[0] + Sensor_Value[2] + Sensor_Value[3] + Sensor_Value[5] + Sensor_Value[7]);
printf( "output = %f\n", output);
return output;
}
}
float PID(float output)
{
int begin, end;
//-------------------PID prototype---------------------
//-----------PD Constanst============
// Proportional constant
float KP = 0.7;
// Derivative constant
float KD = 0;
//Integral Constant
float KI = 0;
//the place where we will store our integral
int integral;
//the derative
int derivative = 0;
int timeDifference = 0;
//the place where we will store the last error value
timer.start();
begin = timer.read_us();
error = targetPosition - output;
//printf("DIFFERENCE BETWEEN ERRORS %d us", end - begin);
derivative = error - lastError;
//printf("DERIVATE %d\n", derivative);
integral = integral + error;
//pid formula
pid = KP*error + KI*integral + KD*derivative;
printf( "pid = %f\n", pid);
lastError = error;
end = timer.read_us();
timeDifference = end - begin;
return pid;
}