-
Posts
15 -
Cadastrado em
-
Última visita
Reputação
0-
tem alguem que possa me ajuda nesse codigo ele funciona no proteus mas na pratica não // --- Mapeamento de Hardware --- #define dig_uni RB4_bit //Dígito das unidades no RB0 #define dig_dez RB5_bit //Dígito das dezenas no RB1 #define dig_cen RB6_bit //Dígito das centenas no RB2 #define dig_mil RB7_bit //Dígito das milhares no RB3 // --- Constantes do Projeto --- #define shunt 470 //Resistência de desvio igual a 0.47 ohm // --- Protótipo das Funções Auxiliares --- int display(int num); //Exibe o valor correspondente no display de catodo comum int display_dp(int num); //Exibe o valor correspondente no display adicionando o ponto decimal long average_volt(); //Retorna a média de 100 leituras de tensão void volts(); //Calcula a tensão em Volts // --- Variávei Globais --- long store; //Armazena a média de 100 leituras de tensão long t_Volts; //Armazena tensão em Volts long m_amps; //Armazena a corrente em mili Ampères char control = 1; //Variável de controle (para saber qual display está ativo) int cen, dez, uni, mil; //Variáveis auxiliares para dados nos displays int counter = 100; // --- Rotina de Interrupção --- static void interrupt (void) { if(TMR1IF_bit) //Houve o estouro do TMR1? { TMR1IF_bit = 0x00; //Sim, limpa a flag TMR1L = 0x2C; TMR1H = 0xFC; if(!dig_mil && control == 1) //Dígito dos milhares desligado? { //Variável de controle igual a 1? control = 0x02; //Sim, control recebe o valor 2 dig_uni = 0x00; //Apaga dígito das unidades dig_dez = 0x00; //Apaga dígito das dezenas dig_cen = 0x00; //Apaga dígito das centenas PORTC = 0x00; //Desliga PORTC mil = (m_amps/1000); //Calcula o dígito do milhar dig_mil = 0x01; //Ativa dígito dos milhares PORTC = display(mil); //Escreve o valor no display dos milhares } //end if dig_mil else if(!dig_cen && control == 2) //Dígito das centenas desligado? { //Variável de controle igual a 2? control = 0x03; //Sim, control recebe o valor 3 dig_uni = 0x00; //Apaga o dígito das unidades dig_dez = 0x00; //Apaga o dígito das dezenas dig_mil = 0x00; //Apaga o dígito dos milhares PORTC = 0x00; //Desliga PORTC cen = (m_amps%1000)/100; //Calcula o dígito das centenas dig_cen = 0x01; //Ativa dígito das centenas PORTC = display(cen); //Escreve o valor no display das centenas } //end if dig_cen else if(!dig_dez && control == 3) //Dígito das dezenas desligado? { //Variável de controle igual a 3? control = 0x04; //Sim, control recebe o valor 4 dig_uni = 0x00; //Apaga o dígito das unidades dig_cen = 0x00; //Apaga o dígito das centenas dig_mil = 0x00; //Apaga o dígito dos milhares PORTC = 0x00; //Desliga PORTC dez = (m_amps%100)/10; //Calcula o dígito das dezenas dig_dez = 0x01; //Ativa dígito das dezenas PORTC = display(dez); //Escreve o valor no display das dezenas } //end if dig_dez else if(!dig_uni && control == 4) //Dígito das unidades desligado? { //Variável de controle igual a 4? control = 0x01; //Sim, control recebe o valor 1 (para encerrar a lógica) dig_dez = 0x00; //Apaga o dígito das dezenas dig_cen = 0x00; //Apaga o dígito das centenas dig_mil = 0x00; //Apaga o dígito dos milhares PORTC = 0x00; //Desliga PORTC uni = m_amps%10; //Calcula o dígito das unidades dig_uni = 0x01; //Ativa dígito das unidades PORTC = display(uni); //Escreve o valor no display das unidades } } //end if (teste de estouro) } //end interrupt // --- Função Principal --- void main() { ANSEL = 0b00000001; ANSELH = 0; ADCON0 = 0x01; //Aciona o módulo conversor AD, Canal AN0 ADCON1 = 0x10; //Entrada AN0 como analógica CM1CON0 = 0x00; //Desabilita comparadores CM2CON0 = 0x00; CM2CON1 = 0; IRCF0_bit = 1; IRCF1_bit = 1; IRCF2_bit = 1; T1CON = 0x21; //Interrupção global, habilita interrupção do Timer1 TMR1H = 0xFC; TMR1L = 0x2C; //Timer0 incrementa pelo ciclo de máquina TMR1IE_bit = 1; TMR1IF_bit = 0; PEIE_bit = 1; GIE_bit = 1; TRISA = 0b00011111; //Prescaler configurado para 1:16 PORTA = 0b00011111; TRISB = 0x00; //Configura TRISB<7:4> como entrada, TRISB<3:0> como saída TRISC = 0x00; //Configura todo PORTC como saída PORTB = 0x00; //Inicializa PORTB (dígitos desligados) PORTC = 0x00; //Inicializa PORTC (segmentos desligados), RBC em nível alto // --- Loop infinito --- while(1) { volts(); //Chama a função para cálculo da tensão em Volts delay_ms(200); //taxa de atualização } //end while } //end main // --- Desenvolvimento das Funções Auxiliares --- //Esta função acha o bit pertinente a cathode (matrix de bits) para ser enviado //para o PORTC e mostrar um número no display de 7 segmentos. O número //é passado como um parâmetro para a função. int display(int num) { int cathode; //armazena código BCD //-- Vetor para o código BCD -- int SEGMENTO[10] = {0x3F, //BCD zero '0' 0x06, //BCD um '1' 0x5B, //BCD dois '2' 0x4F, //BCD três '3' 0x66, //BCD quatro '4' 0x6D, //BCD cinco '5' 0x7D, //BCD seis '6' 0x07, //BCD sete '7' 0x7F, //BCD oito '8' 0x67}; //BCD nove '9' cathode = SEGMENTO[num]; //para retornar o cathode return(cathode); //retorna o número BCD } //end display int display_dp(int num) //Adiciona o ponto decimal { int cathode; //armazena código BCD //Vetor para o código BCD int SEGMENTO[10] = {0xBF, //BCD zero '0.' 0x86, //BCD um '1.' 0xDB, //BCD dois '2.' 0xCF, //BCD três '3.' 0xE6, //BCD quatro '4.' 0xEd, //BCD cinco '5.' 0xFd, //BCD seis '6.' 0x87, //BCD sete '7.' 0xFF, //BCD oito '8.' 0xE7}; //BCD nove '9.' cathode = SEGMENTO[num]; //para retornar o cathode return(cathode); //retorna o número BCD } //end display void volts() //Função para cálculo da tensão em Volts { store = average_volt(); //Recebe o valor médio da tensão retornado pela função average_volts() t_Volts = (store*4230)/866; //Converte o valor para Volts t_Volts = t_Volts*1000; m_amps = t_Volts/shunt; } //end celsius long average_volt() //Função que calcula a média de 100 leituras de tensão { //Garante maior precisão na medida unsigned char i; //Variável de iterações long volt_store = 0; //Variável local para armazenar o valor da tensão for(i=0; i<100; i++) //Somatório de 100 leituras { volt_store += ADC_Read(0); //temp_store = temp_store + ADC_Read(0) (faz o somatório das 100 iterações) } return(volt_store/100); //retorna a média das iterações } //end average_temp
-
PWM para controle de velocidade de motor AC
sergio3214 respondeu ao tópico de andpudim em Eletrônica
Boa noite Na verdade o que você precisa e de uma rampa de aceleração para controla o Triac Você precisa fazer o controle de um LED que ele amente seu brilho gradativamente começando de 1,5 a 3... automático, conseguindo isso você poderá usa um fotoacoplado ou um rele de estado solido, quanto o desligamento você pode esta colocado um botão push button no Vcc, e assim substitui por um interruptor eletrotécnico. faça uso da sua inteligencia andpudim!! -
//transmit coding #include <18f252.h> #device ADC=8 #fuses HS, NOWDT, NOLVP, NOPROTECT #use delay(clock=4000000) //#use rs232(baud=19200, xmit=PIN_A0, rcv=PIN_A1) // you can use any pins for software uart.. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8,Errors) // characters tranmitted faster than the pic eats them will cause UART to hang. #include <stdlib.h> #define ADC_0 PIN_A0 #define TX_6 PIN_C6 #define RX_7 PIN_C7 void main() { int8 fvalue; setup_adc_ports(AN0);//or setup_adc_ports(ALL_ANALOG) setup_adc(ADC_CLOCK_DIV_8); set_adc_channel(0); delay_us(20); fvalue=read_adc(); putc(fvalue); while (1) { fvalue=read_adc(); putc(fvalue); delay_ms(1000); } } //receive coding #include <18f252.h> #fuses HS, NOWDT, NOLVP, NOPROTECT #use delay(clock=4000000) //#use rs232(baud=19200, xmit=PIN_A0, rcv=PIN_A1) // you can use any pins for software uart.. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8,Errors ) // characters tranmitted faster than the pic eats them will cause UART to hang. #include <stdlib.h> #define LED_0 PIN_A0 #define TX_6 PIN_C6 #define RX_7 PIN_C7 char v1; void main() { int8 fvalue; int8 v1; while(true) { if(!input(pin_A0) ) { fvalue=getc(); v1=(5*((int)fvalue)/255); printf("\ = %u",(int)v1); } } } alguem sabe mim dizer onde estou errando
-
#include <12f675.h> # DEVICE ADC=8 #fuses INTRC_IO,NOWDT,NOPROTECT, NOMCLR ,BROWNOUT, PUT #use delay(clock=4000000) // 4 MHz crystal on PCB //#use rs232(baud=19200, xmit=PIN_A0, rcv=PIN_A1) // you can use any pins for software uart... #use rs232(baud=9600, xmit=PIN_A4, rcv=PIN_A2, PARITY=N, BITS=8,) // characters tranmitted faster than the pic eats them will cause UART to hang. #include <stdlib.h> #define LED_5 PIN_A5 #define LED_1 PIN_A1 #define ciclo_3 PIN_A3 #define TX_4 PIN_A4 #define RX_2 PIN_A2 #define fim 100 int8 periodo=0; int8 ciclo1=0; #int_timer1 void Timer_isr(void) { /*===================== Teste para ciclo = 0 =====================*/ if(ciclo1 == 0) { output_low (PIN_A3); } if(ciclo1 == fim) { output_high(PIN_A3); } /*============================= Já que o ciclo e diferente de 0 ===============================*/ if(periodo < ciclo1) { output_high(PIN_A3); } else { output_low(PIN_A3); } if(periodo >= fim-1) { periodo=0; } periodo++; set_timer1(65440); //65440 } void setup () { SETUP_ADC_PORTS(sAN0); SETUP_ADC(ADC_CLOCK_DIV_8); SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_1); // Configurar timer1 para clock interno/8 enable_interrupts (INT_TIMER1); // Habilitar Interrupções enable_interrupts (GLOBAL); set_timer1(65440); // Preload do timer1 set_adc_channel(0); delay_ms(20); while(TRUE) { ciclo1 = 0.4 * read_adc(); delay_ms (50); } } void main (DADOS) { while (TRUE) { if (input(PIN_A5)){ output_high(LED_5); printf("a"); //sends signal a delay_ms(1000); } else{ output_low(LED_5); printf("l"); //sends signal l delay_ms(200); } if (input(PIN_A1)){ output_high(LED_1); printf("b"); //sends singnal b delay_ms(1500); } else{ output_low(LED_1); printf("s"); //sends signal s delay_ms(500); } } isadora ferraz } adicionado 8 minutos depois isadora ferraz ai esta porém a conversão não esta funcionado
-
isadora essa dai não sei se consigo fazer
-
Isadora Ferraz float v; void main() { setup_adc_ports(AN0_TO_AN1|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); setup_spi(SPI_SS_DISABLED); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_DISABLED|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //setup_oscillator parameter not selected from intr oscillator config tab //TODO: USER CODE!! while (TRUE){ output_high(pin_c0); delay_ms(1000); set_adc_channel(0); //0 delay_us(10); v=read_adc(); v=v*0.0048875855327468; printf("%f \n \r " ,v); } }
-
sim com pic 12f675 pwm tanto o código com na pratica inclusive já apresentei em sala de aula em que o assunto era pwm aqui foi o código ccs #include<12F675.h> #device adc = 8 #FUSES NOWDT // No assista Dog Timer #FUSES INTRC_IO // Cristal internal = 4MHZ #FUSES PUT // Power up Temporizador #FUSES NOPROTECT // Código não protegido contra leitura #FUSES NOMCLR #FUSES BROWNOUT // Repor quando brownout detectado #FUSES NOCPD // Sem proteção EE #use delay(CLOCK = 4000000) #define fim 100 int8 periodo=0; int8 ciclo1=0; #int_timer1 void Timer_isr(void) { /*===================== Teste para ciclo = 0 =====================*/ if(ciclo1 == 0) { output_low (PIN_A2); } if(ciclo1 == fim) { output_high(PIN_A2); } /*============================= Já que o ciclo e diferente de 0 ===============================*/ if(periodo < ciclo1) { output_high(PIN_A2); } else { output_low(PIN_A2); } if(periodo >= fim-1) { periodo=0; } periodo++; set_timer1(65440); //65440 } void main() { SETUP_ADC_PORTS(sAN0); SETUP_ADC(ADC_CLOCK_DIV_8); SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_1); // Configurar timer1 para clock interno/8 enable_interrupts (INT_TIMER1); // Habilitar Interrupções enable_interrupts (GLOBAL); set_timer1(65440); // Preload do timer1 set_adc_channel(0); delay_ms(20); while(TRUE) { ciclo1 = 0.4 * read_adc(); delay_ms (50); } }
-
não conseguir compreender Isadora Ferraz seja ó um pouco mas clara
-
deu pra entende o código mas como enviar esse código para outro pic.. quero aprende a envia o pwm de um pic para outro já conseguir acender um led de um pic para outro mas agora quero o pwm
-
Transmissor #include <mainjk.h> void main() { while(TRUE) { if(input(pin_a7)){printf("a");delay_ms(400);} if(input(pin_a6)){printf("b");delay_ms(400);} } } receptor #include <mainkk.h> char letra; void main() { while(TRUE) { if (kbhit()){ letra=getc(); if (letra=="a"){ output_toggle(pin_a0);} if (letra=="b"){ output_toggle(pin_a1);} } } } e também não obtive sucesso nesse código feito ccs compile
-
Bommu esse codigo foi criado no PicBasico Pro ele não foi criado por mim peguei ele com exemplo mas não obtive sucesso e gostaria de ajuda
-
include "modedefs.bas" DEFINE ADC_BITS 8 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source (rc = 3) DEFINE ADC_SAMPLEUS 50 trisio =%00011111 'input=mclr,pot´s , output= serial ansel = %00111111 b0 var byte b1 var byte b2 var byte b3 var byte b4 var byte w0 var word w1 var word '------------------------------------------------------------ loop: 'Potenciometros: 'Aceleração:5k4 ' 'acel=2k14, meio=2k73, desac.=3k14 '405 512 594 '10bit´s '101 128 148 '8bit´s 'Direção: 5k ' 'esquerda=1k82, meio=2k54, direita=3k3 ' 368 512 675 '10bit´s ' 92 128 168 '8bit´s ' 'Trimmer´s = pot´s de 10k (8k real) pause 5 ' estava 5 adcin 0,b0'acel '101 a 148 adcin 1 ,b1 'direcao '92 a 168 ADCiN 2 ,b2 'trimmer acel '0 a 255 (/5 = 51) adcin 3,b3 'trimmer direcao '0 a 255 (/6 = 42) w0 = b0 + (b2/5) b0 = w0 w1 = b1 + (b3/6) b1 = w1 gosub limites b4 = b0+b1'valor truncado SEROUT gpio.5,N2400,[204,B0,b1,b4] '20.8ms a 2400bps '204 = 11001100 goto loop '-------------------------------------------------- limites: if b0 < 100 then b0 = 100 endif if b1 < 100 then b1 = 100 endif if b0 > 200 then b0 = 200 endif if b1 > 200 then b1 = 200 endif return '--------------------------------------------------- receptor modulo RX include "modedefs.bas" trisio =%00001001 'serin,mclr ansel = 0 cmcon0 = 7 b0 var byte b1 var byte b4 var byte soma var byte c1 var byte c2 var byte '------------------------------------------------------------ loop: SERIN gpio.0,N2400,20,continua,[204],B0,b1,b4 '204 = 11001100 continua: soma = b0+b1 'valor truncado if soma <> b4 then gosub saida goto loop endif c1 = b0 c2 = b1 gosub saida goto loop '---------------------------------------------------------------- saida: high gpio.4 pauseus c1*10 low gpio.4 high gpio.5 pauseus c2*10 low gpio.5 return '----------------------------------------------------------------- olhai tentei no proteus mas ele não fucionor... adicionado 3 minutos depois eu ja fiz um led acender porém quero pwm
-
obrigado meu cara, mas o que eu quero fazer e com envia o sinal de pwm para o pic receptor, atraves da comunicação serial
-
Boa noite Pessoal Gostaria da ajuda de vocês , quero fazer comunicação rf com pic(modulo TX e RX) para que o PIC TX envia o sinal de PWM para o PIC RX para controla a velocidade de um motor CC e de um servomotor. por favor se alguém pode mim ajudar com código de exemplo
-
Mathus LPS preciso de uma ajuda sua! queria saber como faço para habilita o pwm nesse seu código pois já procurei sobre o assunto mas o unica que vir simplificado sobre comunicação entre dois pic foi Você Pode me ajuda
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais