Pesquisar neste blog

16/05/2023

Sequência de outputs com PIC 16F877A

Objetivo: Dar outputs com apenas 4 pinos do PIC sem comprometer os demais pinos e sem utilizar vários high e low.

CÓDIGO FEITO EM CCS C COMPILER

#include <16F877A.h>
#use delay(clock = 20MHz)

#define size 8

int sequences[][2] = {
  {PIN_B4, 1}, {PIN_B5, 0}, {PIN_B6, 0}, {PIN_B7, 1},
  {PIN_B4, 0}, {PIN_B5, 1}, {PIN_B6, 1}, {PIN_B7, 1},
  {PIN_B4, 0}, {PIN_B5, 0}, {PIN_B6, 0}, {PIN_B7, 0},
  {PIN_B4, 1}, {PIN_B5, 0}, {PIN_B6, 1}, {PIN_B7, 1}, 
  {PIN_B4, 0}, {PIN_B5, 0}, {PIN_B6, 0}, {PIN_B7, 0}, 
  {PIN_B4, 0}, {PIN_B5, 0}, {PIN_B6, 0}, {PIN_B7, 1},
  {PIN_B4, 1}, {PIN_B5, 1}, {PIN_B6, 0}, {PIN_B7, 1},
  {PIN_B4, 0}, {PIN_B5, 0}, {PIN_B6, 1}, {PIN_B7, 0}, 
  {PIN_B4, 0}, {PIN_B5, 0}, {PIN_B6, 0}, {PIN_B7, 1},
  {PIN_B4, 1}, {PIN_B5, 0}, {PIN_B6, 1}, {PIN_B7, 1}};

void set_outputs(int outputs[][2], int num_outputs) {
   
    for (int i = 0; i < num_outputs; i++) {
        output_low(outputs[i][0]);
        output_high(outputs[i][1]);
        delay_ms(500);
    }
}

int main() {
      
   for (int i = 0; i < size; i++) {
       set_outputs(sequences[i], 4);
   } 
   
}

Saída gerada

13/05/2023

Motor de passo com frequência - PIC 16F877A

Objetivo: Fazer um programa que rede no PIC 16F877A para girar com determinada velocidade o motor no sentido horário ao pressionar o botão e ao pressionar novamente o botão ele gire no sentido anti - horário. Deverá ser mostrado a frequência em que o motor está girando.

Saída gerada no softwae Proteus
























#include <16F877A.h>
#device adc = 10
#fuses HS, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock = 20MHz)
#define size 8
#define T1 300
#define T2 200

#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7
#define LCD_E     PIN_D0
#define LCD_RS    PIN_D1

#include <lcd.c>
#byte PIR1 = 0x0C

unsigned int cont = 0, speed;
int1 nuevopulso = 0, cambio;
int16 TFB = 0, TFS, TF = 0;
float AP = 0.0, frequencia;

#INT_EXT
void EXT_isr(void) {
   cont++;
   if(cont >= 4){
      cont = 0;
   }
}

#int_ccp1
void ccp1_int(){
   if (cambio == 0 ){
      TFS = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE);
      cambio = 1;
   }else{
      TFB = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE);
      cambio = 0;
      
      if (nuevopulso == 0){
         nuevopulso = 1;
      }
   }
}


void main(){
   setup_timer_1(T1_INTERNAL);
   setup_ccp1(CCP_CAPTURE_RE);
   cambio = 0;
   enable_interrupts(int_ccp1);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_EXT);
   
   setup_adc(ADC_CLOCK_DIV_32);  // Set ASC conversion time to 32 Tosc
   setup_adc_ports(AN0);         // Configure AN0 as analog
   set_adc_channel(0);
   delay_ms(100);
   
   lcd_init();
   
   while(true){
       printf(lcd_putc,"\f\t\tMOTOR OFF !");
       delay_ms(15);
       
       while(cont == 1){
         speed = read_adc();
         if (speed < 2){
            speed = 2;
         }
         
         output_low(PIN_B7);
         output_low(PIN_B5);
         output_low(PIN_B4);
         output_high(PIN_B6);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B5);
         output_low(PIN_B4);
         output_high(PIN_B6);
         output_high(PIN_B5);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }        
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */   
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B6);
         output_low(PIN_B4);
         output_high(PIN_B5);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B6);
         output_high(PIN_B5);
         output_high(PIN_B4);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B6);
         output_low(PIN_B5);
         output_high(PIN_B4);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }        
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B6);
         output_low(PIN_B5);
         output_high(PIN_B4);
         output_high(PIN_B7);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B6);
         output_low(PIN_B5);
         output_low(PIN_B4);
         output_high(PIN_B7);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         delay_ms(speed);
         
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_high(PIN_B6);
         output_high(PIN_B7);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia);
         lcd_gotoxy(21, 2);
         printf(lcd_putc, "W = %0.2f rad/s", frequencia * 2 * 3.15);
         delay_ms(speed);
         
       }
       
       while( cont == 3 ){
         speed = read_adc();
         if (speed < 2){
            speed = 2;
         }
                  
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_high(PIN_B6);
         output_high(PIN_B7);
         
         delay_ms(speed);
                     
                         
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_high(PIN_B7);
         delay_ms(speed);
         
         
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_high(PIN_B4);
         output_high(PIN_B7);
         delay_ms(speed);
         
         
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B4);
         delay_ms(speed);
         
         
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B4);
         output_high(PIN_B5);
         delay_ms(speed);
         
         
         output_low(PIN_B4);
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B5);
         delay_ms(speed);
         
         
         output_low(PIN_B4);
         output_low(PIN_B7);
         output_high(PIN_B5);
         output_high(PIN_B6);
         delay_ms(speed);
         
         
         output_low(PIN_B4);
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B6);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         lcd_gotoxy(1, 1);
         printf(lcd_putc, "SENTIDO ANTI-HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia);
         lcd_gotoxy(21, 2);
         printf(lcd_putc, "W = %0.2f rad/s", frequencia * 2 * 3.15);
         delay_ms(speed);
         
       }
   }
}

07/05/2023

Pulso e Frequência com PIC 16F877A

CÓDIGO FEITO EM CCS C Compiler

#include <16F877A.h>
#fuses XT, NOWDT
#use delay(clock = 4MHz)
#include <lcd.c>

int1 nuevoPulso = 0;
int16 inicioPulso = 0, fimPulso = 0, duracaoPulso = 0;
float periodo = 0.0, frequencia = 0.0;

#int_ccp1
void ccp1_int(){
   if (!nuevoPulso){
      inicioPulso = CCP_1;
      nuevoPulso = 1;
   }
   else{
      fimPulso = CCP_1;
      nuevoPulso = 0;
      
      duracaoPulso = fimPulso - inicioPulso;
   }
}

void calcularPeriodoFrequencia(){
   periodo = duracaoPulso * 1.0 / 1000.0;
   frequencia = 1.0 / (periodo / 1000.0);
}

void main(){
   lcd_init();
   setup_timer_1(T1_INTERNAL);
   setup_ccp1(CCP_CAPTURE_RE);
   enable_interrupts(int_ccp1);
   enable_interrupts(global);
   
   while (TRUE){
      if (nuevoPulso){
         calcularPeriodoFrequencia();
         printf(lcd_putc, "\fPulso = %.2f ms\nFreq= %.2f Hz", periodo, frequencia);
         delay_ms(50);
         nuevoPulso = 0;
      }
   }
}

Saída gerada

02/05/2023

Salvar dados de uma planilha em planilha com google sheets #01

Objetivo: Salvar os dados de uma planilha para outra planilha.

1- Copiar os dados da planilha A
2- Colar em outra URL da planilha B
3- Apagar os dados da planilha A

Resolução:
Código feito em JavaScript

function copyAndPaste() {
  var sourceSheetName = "Rascunho"; // Nome da planilha de origem
  var destSheetName = "Dados Salvo"; // Nome da planilha de destino
 
  // Obter as planilhas de origem e destino
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
sourceSheetName);
  var destSheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/
d/1demeaOTz2gUeSOwjCfOi95RGl2LXEoXWf77SYhvqPjo/edit?usp=sharing"
).getSheetByName(destSheetName);
 
  // Copiar os dados e a formatação
  var range = sourceSheet.getDataRange();
  var values = range.getValues();
  var formats = range.getNumberFormats();
  destSheet.getRange(1, 1, values.length, values[0].length).setValues(values).
setNumberFormats(formats);
 
  // Apagar os dados da planilha de origem
  sourceSheet.clearContents();
}


Planilha A































Planilha B

























Palavras chave:

Zapisz dane z arkusza kalkulacyjnego do arkusza kalkulacyjnego za pomocą Arkuszy Google
Save data from spreadsheet to spreadsheet with google sheets
Lagre data fra regneark til regneark med google sheets
Сохранение данных из электронной таблицы в электронную таблицу с помощью таблиц Google
שמור נתונים מגיליון אלקטרוני לגיליון אלקטרוני באמצעות google sheets
Spara data från kalkylark till kalkylark med google sheets
حفظ البيانات من جدول البيانات إلى جدول البيانات مع أوراق جوجل

01/05/2023

COMANDOS ELÉTRICOS - PARTIDA DIRETA COM REVERSÃO

A partida direta com reversão é um método de partida de motores elétricos que permite sua operação em ambas as direções de rotação, sem a necessidade de um dispositivo adicional como um inversor de frequência.

Essa técnica envolve a utilização de um conjunto de contatos que alterna a polaridade da corrente elétrica fornecida ao motor, invertendo a sua rotação. Ela é comumente utilizada em aplicações que requerem o movimento bidirecional de cargas, como em sistemas de transporte de materiais e em equipamentos de elevação e guindastes.

Durante a partida, a corrente elétrica é fornecida ao motor com polaridade normal, permitindo que ele comece a girar em uma direção. Quando é necessário inverter a direção de rotação, a corrente é interrompida e, em seguida, é invertida a polaridade, fazendo com que o motor comece a girar na direção oposta.

Apesar de sua simplicidade, a partida direta com reversão tem algumas limitações, como a necessidade de um motor com capacidade de suportar altas correntes de partida e a interrupção momentânea do fornecimento de energia durante a inversão da polaridade, o que pode causar vibrações e danos mecânicos.

Simulação no CADSimu