|
|
View previous topic :: View next topic |
Author |
Message |
40inD
Joined: 30 Jul 2007 Posts: 112 Location: Moscow, Russia
|
PWM frequency falls in 4 times after sleep. |
Posted: Wed Apr 20, 2016 1:44 am |
|
|
Why PWM frequency falls in 4 times after sleep instruction (at the end of code)?
When I comment these strings frequency does not change.
Code: |
#include <12F1501.h>
#device ADC=8
#FUSES WDT //Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(internal=8000000)
#define RAND_MAX 255
#INCLUDE <STDLIB.H>
int16 pause , delay_sec;
int d1, d2, d3, d4;
int work_counter=1;
void main()
{
setup_wdt(WDT_16S); //~16,0 s reset
setup_adc_ports(sAN1);
setup_adc(ADC_CLOCK_DIV_64);
setup_timer_2(T2_DIV_BY_64,63,16); // 5kHz 8bit PWM @ 8MHz (0-255)
setup_PWM1(PWM_enabled|PWM_OUTPUT);
setup_PWM2(PWM_enabled|PWM_OUTPUT);
setup_PWM3(PWM_enabled|PWM_OUTPUT);
setup_PWM4(PWM_enabled|PWM_OUTPUT);
set_adc_channel(1);
srand(142);
while(TRUE)
{
delay_ms(1);
pause=read_adc();
srand(work_counter);
d1=rand();
d2=rand();
d3=rand();
d4=rand();
delay_sec=rand(); // ãåíåðèðóåì ñëó÷àéíîå âðåìÿ ðàáîòû ìîòîðîâ îò 0 äî 255 ñåê
set_PWM1_Duty(d1);
set_PWM2_Duty(d2);
set_PWM3_Duty(d3);
set_PWM4_Duty(d4);
for (int a=0; a<delay_sec;a++) // èñïîëíÿåì ñëó÷àéíîå âðåìÿ ðàáîòû ìîòîðîâ îò 0 äî 255 ñåê ñ ðåñòàðòîì âà÷äîãà
{restart_wdt();
delay_ms(1000);
}
set_PWM1_Duty(0); //off
set_PWM2_Duty(0); //off
set_PWM3_Duty(0); //off
set_PWM4_Duty(0); //off
// setup_PWM1(PWM_disabled);
// setup_PWM2(PWM_disabled);
// setup_PWM3(PWM_disabled);
// setup_PWM4(PWM_disabled);
restart_wdt();
for (int i=0; i<pause; i++) //óõîäèì â sleep íà âðåìÿ time*16 sec
sleep();
work_counter++;
}
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Apr 20, 2016 2:39 am |
|
|
Clipped code section, comments inline:
Code: |
//restart_wdt(); - sleep automatically restarts the WDT
for (int i=0; i<pause; i++) //óõîäèì â sleep íà âðåìÿ time*16 sec
{
sleep();
delay_cycles(1); //sleep, should always be followed by a NOP
//Not having this can cause slight problems if things like an
//interrupt triggers a wake - safer to have it.
}
setup_oscillator(OSC_NORMAL | OSC_8MHZ);
work_counter++;
|
If you look at the 'sleep' entry in the data sheet, the first thing done when entering sleep, is to clear the WDT, so you don't need to restart the wdt before calling this.
The oscillator 'wakes' in a default mode. On the boot, the compiler automatically sets it up to your requested 8MHz. After sleep it is back to the default mode, so you need to reset it. |
|
|
40inD
Joined: 30 Jul 2007 Posts: 112 Location: Moscow, Russia
|
|
Posted: Wed May 25, 2016 11:58 pm |
|
|
I have one more problem.
The real PWM frequency is 488 HZ. But timer2 is configured for 5kHz (as says PICWizard). See code above.
I think it's wrong. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Thu May 26, 2016 1:25 am |
|
|
Forget wizards....
8MHz.
Fcy = 2MHz
/64 = 31250Hz
/64 (PR2=63 -> /64) = 488.28125Hz.
For 5KHz, you need Fcy/400
setup_timer_2(T2_DIV_BY_8,49,16); (50*8=400)
Which would give 0-199 for the PWM range
Or using the same divider
setup_timer_2(T2_DIV_BY_8,63,16);
Which would give 3906.25Hz.
However I've just gone and used the wizard for this chip, and it does not give 5KHz for the settings you have (It give 1952Hz). So it is forgetting the initial /4 built into the chip, but doesn't give your figure....
It only gives 5KHz for your settings, if you have not changed the master clock figure from the default 20MHz.
So, fault in it (*4), and fault in your settings (*2.5). GIGO. |
|
|
|
|
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
|