|
|
View previous topic :: View next topic |
Author |
Message |
Ali P Guest
|
PWM Modulator Duty Cycle Problem |
Posted: Fri Aug 10, 2007 2:01 am |
|
|
Hi,
I cannot seem to set the dutty cycle for my PWM to less than 25%. Here is my code:-
Code: | setup_ccp2(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_timer_2(T2_DIV_BY_1, 0xff, 1);
set_pwm2_duty(256); |
This gives me an on time (duty cycle) of 12.8us and a period of 51.2us, but if I reduce the duty cycle setup value to 250 I get an on time of 50us (the period remains 51.2us).
Any ideas?
Regards, Ali |
|
|
Ttelmah Guest
|
|
Posted: Fri Aug 10, 2007 2:41 am |
|
|
The problem is that the pwmx_duty function, will accept long values, or a normal short int, and _switches how it works_, for the different number types. When you send '256', since it is over 255, it is automatically a 'long', and the function treats it as such, giving you the full range of control. As soon as you switch to sending a value under of 255 or under, the function changes mode, and treats the value as an 'int8', effectively multiplying it by 4, before setting the duty cycle.
The ways to deal with this are:
1) Using a constant:
set_pwm2_duty(50L);
Note the 'L'. This means this number is to be treated as a 'long'.
2) Using a variable:
int16 pwm_duty;
pwm_duty=50;
set_pwm2_duty(pwm_duty);
Since the number is put into a long variable, _before_it is given to the function, the function receives it as a 'long'.
3) Using either a constant or a variable, that is an int8.
set_pwm2_duty((int16)50);
This is similar to '1', but functionally slightly different. In '1', the number is explicitly 'made' into an int16. In '3', whatever is given (constant or variable), is _converted_ to an int16, before being given to the function. This is useful, if you want to use an 'int8' to hold a duty cycle, but access only the bottom part of the output range, with this.
Best Wishes |
|
|
Ali P Guest
|
Your answer |
Posted: Fri Aug 10, 2007 3:06 am |
|
|
Hi there,
Thanks for your quick reply, I tried it straight away and it worked no problem. I knew it would be something silly , just couldn't see what!
Thanks again, have a great weekend, Ali |
|
|
|
|
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
|