Ir ao conteúdo
  • Cadastre-se

adilson01

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

Reputação

0
  1. pessoal estou com dificuldade em um projeto da faculdade cujo preciso informar o a velocidade em rpm do motor cc usado um circuito de ponte H. Meu professor deu a dica de usar uma interrupção por time e multiplicar pela quantidade de pulsos que no meu caso é 100 . O programa que eu tenho ate agora é que esta a seguir /* Exemplo para controle de Motor de Corrente Contínua */ #include <18F4550.h> #use delay(clock = 20MHz) #fuses HS, NOWDT, PUT, NOBROWNOUT, NOLVP #use rs232(baud = 9600, parity = N, xmit = pin_c6, rcv = pin_c7, bits = 8) #include <stdlib.h> // biblioteca de conversão de valores #define led pin_e2 // Definição de nomes para os canais do encoder. Para determinação do sentido de giro, // ao menos um dos canais deve ser conectado à algum pino de interrupção externa #define CanalB pin_b1 // Definição de nomes para a seleção de sentido de acionamento da Ponte H #define PonteH_1 pin_d0 #define PonteH_2 pin_d1 // Definição de variável(is) global(is) int1 i1_Sentido; int16 i16_iPWM = 0, i16_pPWM = 0; float f_Resolucao = 0, f_Angulo = 0, f_Posicao = 0; char s_Resolucao[4], s_Posicao[10], s_pPWM[4]; signed int16 Contador = 0; // Declaração de funções utilizadas no programa void PiscaLed(void) { // Pisca-pisca para led output_high(led); delay_ms(250); output_low(led); delay_ms(250); return; } void Inicializacao(void) { // Inicialização para controle do motor cc printf("Resolucao do Encoder [ppv = pulsos por volta] = "); gets(s_Resolucao); // após <enter>, lê o valor do tipo string digitado printf("\n\r"); f_Resolucao = atof(s_Resolucao); // converte string em número do tipo float f_Resolucao = 360/f_Resolucao; delay_ms(250); return; } // Declaração das interrupções e suas respectivas funções #int_EXT void EXT_isr(void) { // Este pedaço de código será executado se a interrupção for acionada, ou seja, o Canal A do encoder // passar de nível Alto para Baixo [H_TO_L], conforme configuração no programa principal [void main()] if ( !input(CanalB) ) // Se o Canal B estiver em nível Baixo -> Sentido Horário { Contador--; } if ( input(CanalB) ) // Se o Canal B estiver em nível Alto -> Sentido Anti-Horário { Contador++; } return; } // Função principal void main() { PiscaLed(); // Configuração da(s) Interrupção(ões) Externa(s) disable_interrupts(GLOBAL); // Desabilita todas as interrupções se estiverem habilitadas enable_interrupts(INT_EXT); // Habilita a interrupção externa 0 ext_int_edge(0, H_TO_L); // Configuração da interrupção externa para borda de descida :: High TO Low [H_TO_L] // Se fosse borda de subida :: Low TO High [L_TO_H] enable_interrupts(GLOBAL); // Habilita todas as interrupções // Configuração do sinal PWM setup_ccp1(CCP_PWM); // Configura CCP1 como um PWM // O tempo de ciclo (período, T) será dado pela seguinte expressão: // T = (1/clock)*4*t2div*(período+1) // onde: // T = período (será dado em segundos) // clock = clock configurado em <#use delay(clock = #)> // t2div = número de vezes de oscilação do cristal por instrução (pode ser: T2_DIV_BY_1 ou T2_DIV_BY_4 ou T2_DIV_BY_16) // período = valor que determina quando o valor de clock será resetado (pode ser um inteiro de 0 a 255) // Neste programa o clock é de 20MHz = 20000000Hz, t2div será por 16 (T2_DIV_BY_16) e o período selecionado será de 249. Assim, // T = (1/20000000)*4*16*(249+1) = 0.0008s = 800us :: f = 1/T = 1/0.0008 = 1250Hz (aprox. 1,25kHz) setup_timer_2(T2_DIV_BY_16, 249, 1);// Configura o período T do sinal PWM // Inicialização de escrita na porta serial printf("\n\n\n\r"); printf("::...[ Curso Tecnico em Mecatronica ]...::\n\r"); delay_ms(250); printf(":: Controle de Motor CC ::\n\r"); printf("\n\r"); delay_ms(250); Inicializacao(); // Chama função de inicialização do motor while ( True ) { printf("\n\rDigite a posicao angular desejada: "); gets(s_Posicao); printf("\n\r"); f_Posicao = atof(s_Posicao); delay_ms(250); printf("Digite o percentual de sinal PWM desejado [0 - 100]: "); gets(s_pPWM); printf("\n\n\r"); i16_pPWM = atoi(s_pPWM); delay_ms(250); // Conversão do valor percentual de 0 a 100 para inteiro de 10bits i16_iPWM = i16_pPWM*10; // 100% = 1000 :: 1000/100 = 10 // Exemplo para uso do canal PWM: definição do tempo de ciclo ativo set_pwm1_duty(i16_iPWM); printf("PWM selecionado: %5ld\n\r", i16_iPWM); printf("Posicao atual: %5.1f\n\r", f_Angulo); printf("Posicao desejada: %5.1f\n\r", f_Posicao); if ( f_Posicao <= f_Angulo ) { i1_Sentido = 0; printf("Sentido de giro: Horario\n\r"); } else { i1_Sentido = 1; printf("Sentido de giro: Anti-Horario\n\r"); } if ( i1_Sentido == 0 ) // sentido horário { while ( f_Angulo > f_Posicao ) { // Escrita/Acionamento do Motor CC output_high(PonteH_1); output_low(PonteH_2); f_Angulo = Contador*f_Resolucao; printf("Contador: %5ld :: Angulo: %5.1f\n\r", Contador, f_Angulo); } output_high(PonteH_1); output_high(PonteH_2); } if ( i1_Sentido == 1 ) // sentido anti-horário { while ( f_Angulo < f_Posicao ) { // Escrita/Acionamento do Motor CC output_high(PonteH_2); output_low(PonteH_1); f_Angulo = Contador*f_Resolucao; printf("Contador: %5ld :: Angulo: %5.1f\n\r", Contador, f_Angulo); } output_high(PonteH_1); output_high(PonteH_2); } } disable_interrupts(GLOBAL); // Desabilita todas a interrupcoes externas se estiverem habilitadas as informação que eu tennho do motor de passo é 12V 1,8/passo.
  2. Olá pessoal . Gostaria de fazer um voltímetro para colocar em uma fonte dc regulada que eu fiz. Utilizado o pic18f4550 e um display LCD,preciso de um projeto em linguagem c que forneça através do display a tensão e a corrente fornecida pela fonte. Agradeço a quem poder ajudar. obs: tensão máxima fornecida 20V

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

×
×
  • Criar novo...