CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

PWM Problem
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
mazedm80



Joined: 18 Feb 2015
Posts: 12

View user's profile Send private message

PWM Problem
PostPosted: Wed Feb 18, 2015 9:31 am     Reply with quote

I'm having problem with pwm... I'm using L298 motor driver and PIC18F2550 mcu...
suppose
Code:

left_motor_speed=255;
right_motor_speed=255;

set_pwm1_duty(left_motor_speed);   //Left Motor Speed
set_pwm2_duty(right_motor_speed);  //Right Motor Speed

the motor did not run,
but if i use
Code:

set_pwm1_duty(255);   //Left Motor Speed
set_pwm2_duty(255);  //Right Motor Speed

it works fine, or if i use
Code:

set_pwm1_duty(left_motor_speed);   //Left Motor Speed
set_pwm2_duty(255);  //Right Motor Speed

it also works, so i didnt get the problem with this variable !!!
plz help....
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Feb 18, 2015 9:59 am     Reply with quote

You need to post a small, compilable program that doesn't work.
'code snippets' don't tell the complete story.
You could have 'something' else causing the problem that we annot see.


Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Wed Feb 18, 2015 11:56 am     Reply with quote

and particularly the declaration of the motor_speed variables. I can see where a factor of 4 change in what the PWM will actually 'do' will appear depending on how these are declared....
mazedm80



Joined: 18 Feb 2015
Posts: 12

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 4:49 am     Reply with quote

Code:
#include <18f2520.h>
#fuses HS,NOWDT,NOPUT
#use delay (crystal = 20MHz)

#define R2   PIN_C0 //with ccp2
#define L2   PIN_C3 //with ccp1

int16 a=250;
int16 b=250;

void main(){ 
  //************timer 2 for PWM *******************
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4, 255, 1);
   delay_us(100);
while(TRUE){
      output_high(L2);
      set_pwm1_duty(a);
      output_low(R2);
      set_pwm2_duty(b);
}

}

this is sample code...
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 8:00 am     Reply with quote

OK. So your code is short enough.

I assume you are really using 18F2520 NOT 18F2550.
(You've got different parts in separate posts.)

Before I start to experiment:-
Can you tell us EXACTLY what it is doing/not doing so we don't have to guess. What do your pulses look like etc.
Saying "the motor did not run" is not entirely helpful.

Mike
mazedm80



Joined: 18 Feb 2015
Posts: 12

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 8:28 am     Reply with quote

i dont have any oscilloscope, and when i burn this code the motor rotate but the rpm is like 1 or less...but if i directly give
set_pwm1_duty(250);
instead of
set_pwm1_duty(a);
works fine.
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 9:28 am     Reply with quote

Straight away, it will be different.

set_pwm1_duty(250);

Will treat '250', as an int8. So will set the PWM, to effectively 1000.....

load 'a' with 1000.

If you want to use values 0 to 255, then declare 'a' as an int8, not an int16.

Read the manual on set_pwmx_duty. Particularly what is done, if 'value' is an 8 bit item.
mazedm80



Joined: 18 Feb 2015
Posts: 12

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 10:09 am     Reply with quote

int8 or int16 it doesn't work...
and set_pwm, it also takes int16 values...
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 10:31 am     Reply with quote

Code:

   int8 a;
   a=250;
   set_pwm1_duty(a);

   //is _identical_ to:

   set_pwm1_duty(250);

   int16 a
   a=248; //only because 250, does not exactly divide by 4
   set_pwm1_duty(a)

   //gives the same result as:
   set_pwm1_duty(62);

   //or

   int16 a
   a=250;
   set_pwm1_duty(a)

   //is the same as:

   set_pwm1_duty(250L); //note the 'L'
   
   int16 a
   a=1000;
   set_pwm1_duty(a)

   //gives the same result as:
   set_pwm1_duty(250);


The point is that set_pwm1_duty, is an _overloaded_ function.
It has two different versions. One accepts an int8, the other accepts an int16. It switches which version is used according to the type of the number it receives. If you use an int8, it multiplies this by 4 and loads this as the value to use. If you use an int16, this multiplication does not occur.
mazedm80



Joined: 18 Feb 2015
Posts: 12

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 11:06 am     Reply with quote

u dont get my problem bro...

int8 a;
a=250;
set_pwm1_duty(a);
its not the problem...
the problem is
int8 a,b;
a=250;
b=250;
set_pwm1_duty(a);
set_pwm2_duty(b);

when i give values from 2 variable in 2 pwm port it didnt works, but one variable works...
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 12:42 pm     Reply with quote

Post your CCS compiler version. It's a 4-digit number, such as 5.035
and is at the top of the .LST file. The .LST file will be in your project
directory after you compile a project with no errors. I will install and
test your version in hardware.
mazedm80



Joined: 18 Feb 2015
Posts: 12

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 1:13 pm     Reply with quote

Version 5.013
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 1:46 pm     Reply with quote

If you're using an 18F2520 then look at the datasheet for the 28 pin usage.

I read that either pin 12 or pin 24 can be used for CCP2......and that ccp1 is on pin 11, so I 'm confused as to which PIC you're using and which I/O pin you've chosen for the CCP2 output.

jay
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 2:17 pm     Reply with quote

I installed vs. 5.013 and compiled your program, as shown below, and
ran it on an 18F2620 and it worked. I see PWM on both channels on my
scope. I don't have an 18F2520, but the 18F2620 is in the same PIC family. Just to be sure, I compiled your program for both PICs with
vs. 5.013 and the code looks the same.

I think, maybe your power supply is getting loaded down when you run
both PWM channels, and it's shutting down the PIC.
Code:

#include <18f2520.h>
#fuses HS,NOWDT,NOPUT
#use delay (crystal = 20MHz)

#define R2   PIN_C0 //with ccp2
#define L2   PIN_C3 //with ccp1

int16 a=250;
int16 b=250;

void main(){ 
  //************timer 2 for PWM *******************
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4, 255, 1);
   delay_us(100);
while(TRUE){
      output_high(L2);
      set_pwm1_duty(a);
      output_low(R2);
      set_pwm2_duty(b);
}

}
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Thu Feb 19, 2015 2:53 pm     Reply with quote

mazedm80 wrote:
i dont have any oscilloscope, and when i burn this code the motor rotate but the rpm is like 1 or less...but if i directly give
set_pwm1_duty(250);
instead of
set_pwm1_duty(a);
works fine.

OK. So you don't have a 'scope (makes life difficult).

You need to check out PCM programmer's theory.
Disconnect the motor drives, and monitor the PWM outputs with a voltmeter.
Failing that you could try with a pair of LEDs and associated resistors.
(Getting desperate now.)

Mike
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group