simulador x pratica

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor thiaguinho_le » 13 Nov 2009 13:59

opa,

então, estou utilizando a equação geral da reta, a*x+b*x+c=0... eu tenho x e y, seriam os pontos de limite sobre a reta x, no caso, X0=y e X1=x, k e d seriam os pontos que quero achar em cima da reta, no caso, k estaria entre 107 e 247 e d estaria sobre a reta x entre 0 e 1024... meus limites naturais pelo controlador seriam 0 a 1024 sobre x, sendo que eu forneço no meu caso para meu x e y sobre a reta x os valores de 61 e 656, valores aproximados de 0.3v e 3.2v... desculpa eu joguei a função ali em cima e não notei que estava faltando dizer o que significava cada variavel... bem.. meu sinal continua oscilando huahuahua... valeu a ajuda Mor_al
abraço

MOR_AL escreveu:Olá Thiaguinho.

Esta sua equação k = f(d, x, y), só é uma reta nos eixos cartesianos x e y, se:

"k" e "d" forem constantes, uma vez que a equação k = f(d, x, y), se reescreve:
y = [(k - 107) / (k - 247)] * x + (140 * d) / (247 - k).
... O que dá a forma da equação da reta y = A * x + B. A e B constantes.
Você deseja que o intervalo no eixo y seja y[107,247].
Agora. Imagino que a entrada seja uma tensão que você aplica no CAD do PIC, certo? Essa entrada produz um valor na saída do CAD entre 0 e 1024. Certo? Então:

Sua reta passa pelos pontos P0(x0,y0) = P0(0,107) e P1(1023,247)
Considerando a equação da reta: (y - y0) = m (x - x0), tem-se:
x0 = 0, y0 = 107 e.... m = (247 - 107) / (1023 - 0)
O que dá:

y = 0,1368523949 * x + 107

Conferindo:
P/ x = 0 --> y = 107 ... E
p/ x = 1023 --> y = 247
O que confere!!

O seu x é a saída do CAD e o seu y é a variável que varia entre 107 e 207.

MOR_AL
thiaguinho_le
Bit
 
Mensagens: 22
Registrado em: 06 Out 2009 14:08

Mensagempor MOR_AL » 13 Nov 2009 14:25

Pô Thiaguinho.
Acho que você não entendeu. :cry:
Releia o meu post anterior e tente entender.
A equação que você procura está aí...Mais direta. :idea:
Veja a figura abaixo e tente substituir x, pelo valor decimal que compõe os 10 bits, que formam a saída do CAD (de 0 a 1023). O valor de y é o que você deseja. :D
Imagem
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor thiaguinho_le » 13 Nov 2009 15:11

oi MOR_AL,

valeu a dica, eu usei uma equação parecida, era y=99+((140*x)/1023), que ia de 0 ate 1023, so que assim, eu preciso que varie de 0.3 ate 3.2, substituindo os valores que quero (61 para y e 656 para x) na equação que eu coloquei acima eu tenho, k=((140*d)/594)+93, isso faz com que eu consiga trablha 61 a 656 de uma forma direta.
abaixo segue o programa q estou utilizando...

Código: Selecionar todos
void main()
{
    ANSEL = 0b00000001;    // configura gp0 como analogica e prescaler em fosc/64
    CMCON0 = 7;            //configura cin e cout como portas i/o e desabilita comparador
    TRISIO = 0b00000001;   // gp0 como entrada, todas as outras como saida
    // configura ad, GP 0
    ADCON0 = 0b10000001;   // configura o A/D, utiliza o canal an0, VREF interno, admr a direita
    // inicia PWM em baixo
    GP2_bit = 0;
    // configurando timer0
    OPTION_REG = 0b10000111; //Atribui prescaler de 1:256 ao TMR0
    TMR0 = 99;              // começa a contagem a partir de 99 ate 256, equivale a 20ms
    INTCON = 0b11100000; //Hab. a int. do TMR0, conf. os registros GIE e T0IE
    // desabilita os modos de pwm, comparação e captura e habilita gp2 = i/o
    CCP1CON = 0;
   
    while(1)
    {
       if (TMR0==k) GP2_bit = 1;      // faz o controle de carga do PWM
    }
}

void interrupt (void) //rotina de interrupção
{
    TMR0 = 99;       // determina o periodo do PWM
    GP2_bit = 0;     // inicializa o PWM em alto
    INTCON = 0b11100000; //Configura T0IE e limpa T0IF, em bin
                                             0b00100000
    ADCON0 = 0b10000001;      // configura ad
    Delay_us(5);                // 5us necessarios para a leitura do adc
    GO_DONE_bit = 1;           // seta o bit para se fazer a leitura
    while(GO_DONE_bit);        // quando o bit retorna para zero é feito
                                               a                 leitura do ad
    d=((ADRESH<<8)+ADRESL);    // guarda na variavel x o valor lido no adc
    //k=(((140*d)+(107*x)-(247*y))/(x-y));        // valor de carga ja     
                                //com  a conversão para a comparação com o timer
    if(61<=d<=656)
    {
       k=((140*d)/594);
       k=k+93;  // 93 é tirado da soma entre (107*x)-(247*y)/594,   
                      //y =61       x = 656
    }
    if(k<107)k=107;
    if(k>247)k=247;
}


valeu MOR_AL
abraço
thiaguinho_le
Bit
 
Mensagens: 22
Registrado em: 06 Out 2009 14:08

Mensagempor MOR_AL » 13 Nov 2009 16:26

Ok!!!
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Anterior

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x