timer_value = (0.07625 * ADC_Read(0) + 39.00) * 2.0
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 unsigned int timer_value = 0; unsigned int pwm_on_time_timer_value = 0, pwm_off_time_timer_value = 0; double duty = 0; unsigned char myFlags = 0; sbit pwm_toggle_flag at myFlags.B0; //Timer0 //Prescaler 1:256; TMR0 Preload = 39; Actual Interrupt Time : 55.552 ms //Place/Copy this part in declaration section void InitTimer0() { OPTION_REG = 0x87; TMR0 = 39; INTCON = 0xA0; } void Interrupt() { if((TMR0IE_bit) && (TMR0IF_bit)) { //Enter your code here pwm_toggle_flag = ~pwm_toggle_flag; if(pwm_toggle_flag == 1) { TMR0 = pwm_on_time_timer_value; LATA2_bit = 1; } else if(pwm_toggle_flag == 0) { TMR0 = pwm_off_time_timer_value; LATA2_bit = 0; } TMR0IF_bit = 0; } } void main() { OSCCON = 0b01101011; //OSC - INTRC 4 MHz OSCTUNE = 0x00; CM1CON0 = 0x00; //Disable Comparators ADCON1 = 0b11010000; ANSELA = 0x03; //Disable ADC TRISA = 0x03; //PORTA all pins digital output PORTA = 0x00; //Clear PORTA - Used for Inputs LATA = 0x00; //Clear PORTA Latch Regsisters - Used for Output InitTimer0(); while(1) { asm clrwdt //Clear WDT timer_value = (0.07625 * ADC_Read(0) + 39.00) * 2.0; Delay_us(20); duty = ADC_Read(1) * 0.09776; Delay_us(20); pwm_on_time_timer_value = timer_value * duty / 100.0; pwm_off_time_timer_value = timer_value - pwm_on_time_timer_value; } }
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 unsigned int timer_value = 0; unsigned int pwm_on_time_timer_value = 0, pwm_off_time_timer_value = 0; double duty = 0; unsigned char myFlags = 0; sbit pwm_toggle_flag at myFlags.B0; //Timer0 //Prescaler 1:256; TMR0 Preload = 39; Actual Interrupt Time : 55.552 ms //Place/Copy this part in declaration section void InitTimer0() { OPTION_REG = 0x87; TMR0 = 39; INTCON = 0xA0; } void Interrupt() { if((TMR0IE_bit) && (TMR0IF_bit)) { //Enter your code here pwm_toggle_flag = ~pwm_toggle_flag; if(pwm_toggle_flag == 1) { TMR0 = pwm_off_time_timer_value; LATA2_bit = 1; } else if(pwm_toggle_flag == 0) { TMR0 = pwm_on_time_timer_value; LATA2_bit = 0; } TMR0IF_bit = 0; } } void main() { OSCCON = 0b01101011; //OSC - INTRC 4 MHz OSCTUNE = 0x00; CM1CON0 = 0x00; //Disable Comparators ADCON1 = 0b11010000; ANSELA = 0x03; //Disable ADC TRISA = 0x03; //PORTA all pins digital output PORTA = 0x00; //Clear PORTA - Used for Inputs LATA = 0x00; //Clear PORTA Latch Regsisters - Used for Output InitTimer0(); while(1) { asm clrwdt //Clear WDT timer_value = (0.07625 * ADC_Read(0) + 39.00) * 2.0; Delay_us(20); duty = ceil((double)ADC_Read(1) * 0.09776); Delay_us(20); pwm_on_time_timer_value = timer_value * duty / 100.0; pwm_off_time_timer_value = timer_value - pwm_on_time_timer_value; } }
What about 0% duty cycle? ;-)In 100% duty PWM frequency suddenly becomes 0 ?
timer_reload_value = 19.35 * ADC_Read(0) + 10036;
duty = ADC_Read(1) * 0.09776;
TMR0IF_bit = 0;
TMR1IF_bit = 0;
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #define Lo(param) ((char *)¶m)[0] #define Hi(param) ((char *)¶m)[1] double timer_value = 0; unsigned int pwm_on_time_timer_value = 0, pwm_off_time_timer_value = 0; double duty = 0; unsigned char myFlags = 0; sbit pwm_toggle_flag at myFlags.B0; //Timer1 //Prescaler 1:2; TMR1 Preload = 26536; Actual Interrupt Time : 78 ms //Place/Copy this part in declaration section void InitTimer1() { T1CON = 0x11; TMR1IF_bit = 0; TMR1H = 0x67; TMR1L = 0xA8; TMR1IE_bit = 1; INTCON = 0xC0; } void Interrupt() { if((TMR1IE_bit) && (TMR1IF_bit)) { //Enter your code here if(LATA2_bit == 0) { TMR1H = Hi(pwm_off_time_timer_value); TMR1L = Lo(pwm_off_time_timer_value); LATA2_bit = 1; } else if(LATA2_bit == 1) { TMR1H = Hi(pwm_on_time_timer_value); TMR1L = Lo(pwm_on_time_timer_value); LATA2_bit = 0; } TMR0IF_bit = 0; } } void main() { OSCCON = 0b01101011; //OSC - INTRC 4 MHz OSCTUNE = 0x00; CM1CON0 = 0x00; //Disable Comparators ADCON1 = 0b11010000; ANSELA = 0x03; //Disable ADC TRISA = 0x03; //PORTA all pins digital output PORTA = 0x00; //Clear PORTA - Used for Inputs LATA = 0x00; //Clear PORTA Latch Regsisters - Used for Output InitTimer1(); while(1) { asm clrwdt //Clear WDT timer_value = 19.35 * ADC_Read(0) + 10036; Delay_us(20); duty = ceil((double)ADC_Read(1) * 0.09776); Delay_us(20); pwm_on_time_timer_value = ceil(timer_value * duty / 100.0); pwm_off_time_timer_value = ceil(timer_value - pwm_on_time_timer_value); } }
... is useless, because it doesn´t describe anything.Now, code is not working as needed.
... is useless, because it doesn´t describe anything.... but freq and duty are not correct.
Code:while(1) { asm clrwdt //Clear WDT timer_value = 19.35 * ADC_Read(0) + 10036; Delay_us(20); duty = ceil((double)ADC_Read(1) * 0.09776); Delay_us(20); pwm_on_time_timer_value = ceil(timer_value * duty / 100.0); pwm_off_time_timer_value = ceil(timer_value - pwm_on_time_timer_value);
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?