#include <LPC213x.h>
#include <math.h>
#include <stdio.h>
void input();
void adc_ini();
void adc_data();
void pwm();
void motor();
void motorzero();
void delay();
unsigned long val,adc_val;
float y,s,v,m;
float angle,b;
int main(void)
{
input();
pwm();
while(1)
{
adc_ini();
adc_data();
motor();
}
}
void input(void)
{
PINSEL0 = 0x00028000; /* binary: 00000000_00000010_10000000_00000000 */
IO0DIR = 0x80000000; /* binary: 10000000_00000000_00000000_00000000 */
PINSEL1 = 0x01000000; /* binary: 00000001_00000000_00000000_00000000 */
PINSEL2 = 0x00000000; /* binary: 00000000_00000000_00000000_00000000 */
IO1DIR = 0x00000000; /* binary: 00000000_00000000_00000000_00000000 */
}
void adc_ini(void)
{
PCONP = (PCONP & 0x001817BE) | (1UL<<12); /* Enable peripheral clock for ADC0 (default is enabled) */
AD0INTEN = 0x00000000; /* binary: 00000000_00000000_00000000_00000000 */
AD0CR = 0x01200202; /* binary: 00000001_00100000_00000000_00000010 */
}
void adc_data(void)
{
while((AD0DR & 0x80000000)==0); //until bit 31 is high (DONE)
val = AD0DR; //read a/d data register
adc_val = ((val >> 6) & 0x3FF); // Extract AD result
}
void pwm(void)
{
PCONP = (PCONP & 0x001817BE) | (1UL<<5); /* Enable peripheral clock for PWM0 (default is enabled) */
PWMTC = 0x00000000; /* decimal 0 */
PWMPR = 0x0000003B; /* decimal 59 */
PWMMCR = 0x00000002; /* binary: 00000000_00000000_00000000_00000010 */
PWMMR0 = 0x000003E8; /* decimal 1000 */
PWMMR2 = 0x0000004B; /* decimal 75 */
PWMMR4 = 0x0000004B; /* decimal 75 */
PWMPCR = 0x00001400; /* binary: 00000000_00000000_00010100_00000000 */
PWMTCR = 0x09; /* binary: 00001001 */
}
void motor(void)
{
if ((adc_val>=0x0000020E) && (adc_val<0x00000224))
{
PWMMR2 = 0x0000004C;
PWMMR4 = 0x0000004A;
PWMLER = 0x00000014;
}
else if ((adc_val>=0x00000224) && (adc_val<0x00000238))
{
PWMMR2 = 0x0000004D;
PWMMR4 = 0x00000049;
PWMLER = 0x00000014;
}
else if ((adc_val>=0x00000238) && (adc_val<0x0000024C))
{
PWMMR2 = 0x0000004E;
PWMMR4 = 0x00000048;
PWMLER = 0x00000014;
}
else if ((adc_val>=0x0000024C) && (adc_val<0x00000260))
{
PWMMR2 = 0x0000004F;
PWMMR4 = 0x00000047;
PWMLER = 0x00000014;
}
/*for negative angle*/
else if ((adc_val<=0x000001B8) && (adc_val>0x000001A3))
{
PWMMR2 = 0x0000004A;
PWMMR4 = 0x0000004C;
PWMLER = 0x00000014;
}
else if ((adc_val<=0x000001A3) && (adc_val>0x0000018F))
{
PWMMR2 = 0x00000049;
PWMMR4 = 0x0000004D;
PWMLER = 0x00000014;
}
else if ((adc_val<=0x0000018F) && (adc_val>0x0000017A))
{
PWMMR2 = 0x00000048;
PWMMR4 = 0x0000004E;
PWMLER = 0x00000014;
}
else if ((adc_val<=0x0000017A) && (adc_val>0x00000167))
{
PWMMR2 = 0x00000047;
PWMMR4 = 0x0000004F;
PWMLER = 0x00000014;
}
else
{
motorzero();
}
}
void motorzero(void)
{
PWMMR2 = 0x0000004B;
PWMMR4 = 0x0000004B;
PWMLER = 0x00000014;
}
void delay(void)
{
long int i,j,c;
for(i=0;i<400;i++)
{
for(j=0;j<1000;j++)
{
c++;
}
}
}