generare segnale PWM PIC 16f877a c++ *****!
Ciao a tutti, scusate se non ho cercato bene e l'argomento già esiste, dobbiamo generare un segnale PWM con il PIC 16f877a per pilotare una ventola in dc, in c++ con il programma PIC c compiler.
Non riusciamo proprio a generare questo segnale, vi prego datemi una mano con il programma, ditemi se è sbagliato, e dove. magari c'è qualche buon anima che lo riscrive? Il mio livello di c++ è pari a zero, sto in 5 e mi serve come progetto di tdp se no mi mette il debito, a me al mio gruppo e al 95% della classe.
PWM freq. 10.000 duty 80
L'oscillatore è a 20mhz
Ho copiato questa istruzione dal professore:
Timer> timer 2 enable
other > ccp1 > PWM freq. 10.000 duty 80
timer 1 (t2_div_by_4,70,1)
set_pwm1_duty((int16)140)
setup timer 2
setup_ccp1
while_true{
delay_ms 2000
set_pwm1_duty((int16)99)
delay_ms 2000
set_pwm1_duty((int16)198)
delay_ms 2000
set_pwm1_duty((int16)297)
delay_ms 2000
set_pwm1_duty((int16)393)
E ho copiato il programma, ma non funziona! perché?
Datemi una mano grazie!
Non riusciamo proprio a generare questo segnale, vi prego datemi una mano con il programma, ditemi se è sbagliato, e dove. magari c'è qualche buon anima che lo riscrive? Il mio livello di c++ è pari a zero, sto in 5 e mi serve come progetto di tdp se no mi mette il debito, a me al mio gruppo e al 95% della classe.
PWM freq. 10.000 duty 80
L'oscillatore è a 20mhz
Ho copiato questa istruzione dal professore:
Timer> timer 2 enable
other > ccp1 > PWM freq. 10.000 duty 80
timer 1 (t2_div_by_4,70,1)
set_pwm1_duty((int16)140)
setup timer 2
setup_ccp1
while_true{
delay_ms 2000
set_pwm1_duty((int16)99)
delay_ms 2000
set_pwm1_duty((int16)198)
delay_ms 2000
set_pwm1_duty((int16)297)
delay_ms 2000
set_pwm1_duty((int16)393)
E ho copiato il programma, ma non funziona! perché?
Datemi una mano grazie!
- Codice: Seleziona tutto
#include <main.h>
#include "na_lcd4x20_D2Free.c"
#define LED PIN_D3
#define BUZZER PIN_D2
float volt,val,T;
void Beep(void) {
output_high(BUZZER);
delay_ms(100);
output_low(BUZZER);
}
// --- End Beep Buzzer
// --- Prova led e beep di sistema
void led_buzz(void){
int j;
for(j=0; j<=4; j++) {
delay_ms(400);
output_high(LED);
Beep();
delay_ms(400);
output_low(LED);
}
}
// --- End Prova led e beep di sistema
// --- Presentazione progetto in avvio
void presentation(void){
lcd_putc("\f"); //Pulisco il display
lcd_gotoxy(2,1);
lcd_putc("PIC16F877A 20 MHz");
beep(); //Avviso start
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("R. C. D. M.");
delay_ms(500);
lcd_gotoxy(1,3);
lcd_putc("1 canale input ADC");
delay_ms(500);
lcd_gotoxy(3,4);
lcd_putc("canale AN0");
led_buzz(); //Avviso start
delay_ms(500);
}
void Testata(void){
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Val: volt:");
lcd_gotoxy(3,2);
lcd_putc("T:");
}
void main()
{
float volt,val,T;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
setup_comparator(NC_NC_NC_NC);
output_low(PIN_D2);
output_low(PIN_D3);
lcd_init();
delay_ms(100);
Presentation();
delay_ms(1000);
Testata();
delay_ms(50);
delay_ms(2000);
set_pwm1_duty((int16)99);
delay_ms(2000);
set_pwm1_duty((int16)198);
delay_ms(2000);
set_pwm1_duty((int16)297);
delay_ms(2000);
set_pwm1_duty((int16)393);
delay_ms(2000);
set_pwm1_duty((int16)99);
delay_ms(2000);
set_pwm1_duty((int16)198);
delay_ms(2000);
set_pwm1_duty((int16)297);
delay_ms(2000);
set_pwm1_duty((int16)393);
//ripete il ciclo infinite volte
while(true){
set_adc_channel(0); //seleziona il canale 0 dell'ADC(AN0)
delay_us(50);
val=read_adc();//leggo valori registrati
volt=(float)val*0.0048828;//ampiezza segnale di ingresso = valore ADC x risoluzione
T = (volt*100)/5;
lcd_gotoxy(5,1);
printf(lcd_putc,"%.2f ",val);
lcd_gotoxy(17,1);
printf(lcd_putc,"%.2f",volt);
lcd_gotoxy(5,2);
printf(lcd_putc,"%2.2f",T);
if(volt>4){
output_high(buzzer);
delay_ms(200);
output_low(buzzer);
}
}
}