This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Use ADC to control a pwm

Other Parts Discussed in Thread: MSP430G2553

i'm really noob on C programing ...

someone can help me  on programming? 


#include <msp430g2553.h>
/*
ANALOGICO AUXILIAR (P1.2) SERÁ UTILIZADO PARA MOVER O ROV PARA BAIXO/CIMA (MOTOR_VERT1 E 2)
ESQUERDA/DIREITA (MOTOR_LAT1 E 2)
*/
//-----------------------Entradas----------
#define BOTAOLUZ (P1IN&0x08) //P1.3 LUZ
#define ANA_X (P1IN&0x01) //P1.0 ANALOGICO X
#define ANA_Y (P1IN&0x02) //P1.1 ANALOGICO Y
#define ANA_A (P1IN&0x04) //P1.2 ANALOGICO AUXILIAR

//----------------------Saidas--------------
#define LUZ_ON (P1OUT|=0x80) //P1.7 LUZ =1
#define LUZ_OFF (P1OUT&=~(0x80)) //P1.7 LUZ =0
//motor frontal esquerdo: P2.1 e P2.4 //P2.1 P2.4 PH F1
#define MOTOR_FRONT_E1 0x02
#define MOTOR_FRONT_E2 0x10

//motor frontal direito:P2.0 E P2.5 //P2.0 P2.5 PH F2
#define MOTOR_FRONT_D1 0x01
#define MOTOR_FRONT_D2 0x20

// motor vertical :P2.2
#define MOTOR_VERT1 0x04

//-------------------PWM----------------------
#define PERIODO 20000 //20ms
#define MINIMO 540 //Ton minimo
#define MAXIMO 2340 //Ton maximo
#define PASSO 10*10 // passo=10y , onde y é o grau (º) desejado.
#define LED 0x02 //LED LIGADO NO PINO 2.1
#define PINO_BOTAO 0x08 //botao = P1.3


/**************** Ajuste de configuração do servo *****************
//Oscilador interno (SMCL=DCO) = 1MHz (aproxidamente)
//Divisor do clock = 1 => período de contagem é de 1us = 1/1000000
//Período de 20ms (freq. servo=50Hz=> 1/50=20ms)
//Então o valor a ser ajustado para contar 1us é de 2000 contagens (20ms/1us)
//O registro CCR0 define o período = 2000
//O registro CCR1 define o DC. Para o servo em questão devemos ter os tempos
//ligados relacionados a seguir (valores ajustados na prática)
//Posicao 0 => Ton=5.4ms => 5.4ms/1us = 540 (valor min do CCR1 inicial)
//Posicao 180 => Ton=2,34ms => 2.43ms/1us=2340 (valor max do CCR1)
//Resumindo:
540 _________ 0º
---------> xº = 10x <-----------
2340 _________ 180º
*/

/* Funcionamento do timer no MSP430

CCR0 => PERIODO e CCR1 => Tempo em alta (TON)
QUANDO COMEÇA => PINO = 1 (CONFIGURACAO DO CCTL1)
O TIMER COMEÇA DE ZERO E VAI CONTANDO ATÉ CHEGAR NO VALOR DO CCR1.
QUANDO ATINGIR O VALOR DO CCR1 O PINO SERÁ ZERADO E CONTINUA CONTANDO
ATÉ CHEGAR NO CCR0. QUANDO CHEGAR NO CCR0, O PINO SERÁ SETADO E O PROCESSO
SE REINICIA AUTOMATICAMENTE
*/

unsigned int pwm=MINIMO;
//unsigned char sentido=0;
unsigned int valorad1, pwm1, valorad2, pwm2, valorad3, pwm3;
/************************DECLARAÇÃO DAS FUNÇÕES DEFINIDAS (VOID)*********/
unsigned int LeAD1 (void);
unsigned int LeAD2 (void);
unsigned int LeAD3 (void);
void delayms (unsigned int tempo);
void atualiza_pwm (void);
void config_pwm (void);
void ConfigAD (void);
void config_pwm_frontal_1 (void);
void config_pwm_frontal_2 (void);
void config_pwm_vertical_1 (void);
//void config_pwm_vertical_2 (void);
void config_pwm_lateral_1(void);
void config_pwm_lateral_2 (void);
/***************************************************************************/
char luz=0;
void main (void)
{

WDTCTL = WDTPW + WDTHOLD;
P1REN |=PINO_BOTAO ; //pull-up no botao
ConfigAD();
config_pwm();
LUZ_OFF;
P2DIR= 0x20;
for(;;)
{
delayms(1000); //espera 1 segundo
valorad1=LeAD1();
pwm1=valorad1/100; //fazer uma escala pois tem que ajustar o PWM em funcao do motor
atualiza_pwm();
delayms(1000); //espera 1 segundo
valorad2=LeAD2();
pwm2=valorad2/100; //fazer uma escala pois tem que ajustar o PWM em funcao do motor
atualiza_pwm();
delayms(1000);
valorad3=LeAD3();
pwm3=valorad3/100; //fazer uma escala pois tem que ajustar o PWM em funcao do motor
atualiza_pwm();

/*****************LIGANDO E DESLIGANDO A LUZ******************************/
if(BOTAOLUZ==0 && luz==0)
{
LUZ_ON;
luz=1;
}
else if (BOTAOLUZ==0 && luz==1)
{
LUZ_OFF;
luz=0;
}
/**************************************************************************/
if (0<pwm1 && pwm1<341)
{
config_pwm_frontal_1(); // MOTOR ESQUERDO RODA PRA FRENTE
}
else if (685<pwm1 && pwm1<1023)
{
config_pwm_frontal_2(); // MOTOR DIREITO RODA PRA FRENTE
}
/***************************************************************************/
if (0<pwm2 && pwm2<341)
{
config_pwm_vertical_1();
}
else if (685<pwm2 && pwm2<1023)
{
config_pwm_vertical_2();
}
/*****************************************************************************/
if (0<pwm2 && pwm2<341)
{
config_pwm_vertical_1();


}


else if (685<pwm2 && pwm2<1023)
{
config_pwm_vertical_2();
}

}

}

/***************************FUNÇÕES DO PWM***************************************/
void atualiza_pwm (void)
{
TA1CTL=TA1CTL&~(TAIFG);
while ((TA1CTL&TAIFG)==0); //espera fim da contagem atual (sincronizar)
TA1CCR1=pwm; // P2.1
TA1CCR2=pwm2; // P2.4
}

void config_pwm (void)
{
P2DIR |= MOTOR_FRONT1; //configura só o P2.1(TA0.1) como saída (MOTOR_FRONT1)
P2SEL |= MOTOR_FRONT1; //Faz com que o P2.1 seja uma saida especial(PWM)
TA1CCR0 = PERIODO-1; //Valor que terá que contar para gerar o periodo
TA1CCTL1 = OUTMOD_7; //Inicial=1, contagem=CCR1=>0, contagem=CCR0=>0
TA1CCR1 = pwm; //Ton desejado (em escala de 1us)
TA1CTL=TASSEL_2+MC_1+ID_0; //Clock=SMCLK, liga o timer, clock/1
}

void config_pwm_frontal_1 (void)
{
P2SEL &= ~MOTOR_FRONT_E2; //alterando p/ io comum
P2OUT &= ~MOTOR_FRONT_E2;
P2SEL |= MOTOR_FRONT_E1; //alterando p/ pwm
}

void config_pwm_frontal_2 (void)
{
P2SEL &= ~MOTOR_FRONT_D1;
P2OUT &= ~MOTOR_FRONT_D1;
P2SEL |= MOTOR_FRONT_D2;
}

void config_pwm_vertical_1 (void)
{
P2SEL &= ~MOTOR_VERT1;
P2OUT &= ~MOTOR_VERT1;
P2SEL |= MOTOR_VERT2;
}

void config_pwm_vertical_2 (void)
{
P2SEL &= ~MOTOR_VERT2;
P2OUT &= ~MOTOR_VERT2;
P2SEL |= MOTOR_VERT1;
}

void config_pwm_lateral_1(void)
{
P1SEL &= ~MOTOR_VERT1;
P1OUT &= ~MOTOR_VERT1;
P1SEL |= MOTOR_VERT2;
}

void config_pwm_lateral_2 (void)
{
P1SEL &= ~MOTOR_VERT2;
P1OUT &= ~MOTOR_VERT2;
P1SEL |= MOTOR_VERT1;
}

/*********************************** delay ms*******************************/
void delayms (unsigned int tempo)
{
unsigned int i,j;
for(i=0;i<tempo;i++)
{
for(j=0;j<200;j++); //cada ciclo gasta 5us (aproximado)
//para 1ms = 200 x 5us
}
}
/*********************CONVERSOR AD********************************************/

void ConfigAD (void)
{
P1SEL = P1SEL | ANA_X; //Configura o pino P1.0 como entrada AD0
P1SEL = P1SEL | ANA_Y; //Configura o pino P1.1 como entrada AD1
P1SEL = P1SEL | ANA_A; //Configura o pino P1.2 como entrada AD2
ADC10CTL0 = ADC10SR; //Configura o AD com taxa de amostragem de 50kbps
}
//Funcao que le o conversor AD e converte p/ numero
unsigned int LeAD1 (void)
{
unsigned int ad; //variavel local p/ valor do ad
ADC10CTL1 = INCH_0 + ADC10SSEL_2; //Configura o AD para o canal 0 e clock de conversão o MCLK
ADC10CTL0 = ADC10CTL0 | ADC10ON; //liga o conversor AD
ADC10CTL0 = ADC10CTL0 | (ENC + ADC10SC); //habilita a conversao AD
while ((ADC10CTL0 && ADC10IFG)==0); //espera converter (ADC10IFG=1)
ad = ADC10MEM; //carrega o valor lido (ADout)
return (ad);
}

unsigned int LeAD2 (void)
{
unsigned int ad; //variavel local p/ valor do ad
ADC10CTL1 = INCH_1 + ADC10SSEL_2; //Configura o AD para o canal 0 e clock de conversão o MCLK
ADC10CTL0 = ADC10CTL0 | ADC10ON; //liga o conversor AD
ADC10CTL0 = ADC10CTL0 | (ENC + ADC10SC); //habilita a conversao AD
while ((ADC10CTL0 && ADC10IFG)==0); //espera converter (ADC10IFG=1)
ad = ADC10MEM; //carrega o valor lido (ADout)
return (ad);
}

unsigned int LeAD3 (void)
{
unsigned int ad; //variavel local p/ valor do ad
ADC10CTL1 = INCH_1 + ADC10SSEL_2; //Configura o AD para o canal 0 e clock de conversão o MCLK
ADC10CTL0 = ADC10CTL0 | ADC10ON; //liga o conversor AD
ADC10CTL0 = ADC10CTL0 | (ENC + ADC10SC); //habilita a conversao AD
while ((ADC10CTL0 && ADC10IFG)==0); //espera converter (ADC10IFG=1)
ad = ADC10MEM; //carrega o valor lido (ADout)
return (ad);
}

  • Lucas Mendes said:
    someone can help me  on programming? 

    You forgot to mention 1) problem you have 2) what you tried and what kind of results you got 3) what kind of help you need. Don't ask to help programming because effectively it means that you ask others do your job for you.

  • Ilmars said:
    You forgot to

    4) comment the code in a language that is likely to be understood by the ones you ask for help. Else (almost) nobody will take a second look at your code. I recommend using English :)

**Attention** This is a public forum