求助:AD转换程序好像有问题,大神帮忙看看
时间:10-02
整理:3721RD
点击:
用的中颖单片机SH79F6431,用该单片机检测两个x轴,y轴霍尔的电压,并以此计算出摇杆转动的平面角度。用lcd1602显示,目前发现只有将摇杆摇到X,Y位移最大处时,显示才有变化。其他方位不管怎么摇都没有变化。以下贴出相关程序,大神帮忙看看有没有错误main.c
#include <SH79F6431.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "definef.h"
#include "global.h"
#include "intrins.h"
#include "lcd1602.h"
extern uchar a,b;
bit anjian=0;
uchar code dis1[] = {"TianJin GongDa "};
uchar i=0;
void main(void)
{
char str[16];
RSTSTAT =0x01; /* 清看门狗定时器 */
delay(10);
InitialCpu(); /* 初始化 */
lcd_init(); /* 初始化LCD1602 */
delay(10);
lcd_pos(0x00); /* 设置起始坐标 */
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]); //第一行字符显示
i++;
}
i=0;
while(1)
{
RSTSTAT = 0x01; /* 清看门狗定时器 */
if((P4&Bin(00000001))==0)
{
anjian=1;
}
if(anjian==1)
{
ISR_ADC();
AdcProcess();
// memset(str,0,sizeof(str));
sprintf(str,"JiaoDu:%.3f ",b);
// str[16]=0;
lcd_pos(0x00); /* 设置起始坐标 */
while(str[i] != '\0')
{
lcd_wdat(str[i]); //第一行字符显示
i++;
}
i=0;
}
else
{
lcd_pos(0x00); /* 设置起始坐标 */
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]); //第一行字符显示
i++;
}
i=0;
}
}
}
initial.c
#include <SH79F6431.h>
#include <definef.h>
#include "global.h"
#include <sinolib.h>
#include<intrins.h>
void Init_IO(void)
{
P0CR = Bin(11111111); /* P0为lcd控制口 */
P0 = Bin(00000000);
P1CR = Bin(11111111); /* P1为lcd数据口 */
P1 = Bin(00000000);
P4CR = Bin(11111111); /* P4.0为按键*/
P4 = Bin(11111111);
}
/*-----------------------------------------------------*/
void Init_ADC(void)
{
ADCON = Bin(10000000); /* 使能ADC模块 */
ADCH = Bin(00001111); /* P2.3 p2.4用作ADC通道0,1 */
ADT = 0xaf; /* 设置AD采样时间和时钟周期 */
ADCON |= Bin(00000001); /* 开始进行采样 */
}
void Init_IE(void)
{
// Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
IEN0 = Bin(01000000); //IEN0 EA EADC ET2 ES0 ET1 EX1 ET0 ---
IEN1 = Bin(00000000);//IEN1 ELPD ETW1 EPWM ES1 EHSEC EX3 EX2 ---
}
void InitialCpu(void)
{
EA = 0; //关闭全中断
PSW = 0; //clear PSW
Init_IO();
Init_ADC();
Init_IE();
EA = 1; //开启全中断
}
#include <SH79F6431.h>
#include <definef.h>
#include "global.h"
#include <intrins.h>
#include <math.h>
int AdcData=0;
uchar aa; /********转换数据******/
double pi=3.1415926;
//float smax=7;
//float r=7;
double a,b;
int x,y;
/************************AD采集***********************/
void ISR_ADC(void)
{
for(aa=4;aa>0;aa--)
{
ADCON=0x81;
while(ADCON==0x81);
AdcData+=ADDH<<2;
AdcData+=ADDL;
}
AdcData>>=2;
x=-(AdcData-565); /*1.83V=565*/
for(aa=4;aa>0;aa--)
{
ADCON=0x83;
while(ADCON==0x83);
AdcData+=ADDH<<2;
AdcData+=ADDL;
}
AdcData>>=2;
y=(AdcData-565); /*1.83V=565*/
}
ADC.c
void AdcProcess(void)
{
/***********************算角度***********************/
if((x<53)&&(x>-53)&&(y<53)&&(y>-53)) /*x,y霍尔电压在(1.66,2)V是,显示角度为0*/
b=0;
else
{
if(x>0)
{
if(y>0)
b=atan(x/y)+pi/2;
else
{
y=fabs(y);
b=atan(y/x)+pi;
}
}
else
{
if(y>0)
{
x=fabs(x);
b=atan(y/x);
}
else
{
x=fabs(x);
y=fabs(y);
b=atan(x/y)+(pi*3)/2;
}
}
b=b*180/pi;
}
}
#include <SH79F6431.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "definef.h"
#include "global.h"
#include "intrins.h"
#include "lcd1602.h"
extern uchar a,b;
bit anjian=0;
uchar code dis1[] = {"TianJin GongDa "};
uchar i=0;
void main(void)
{
char str[16];
RSTSTAT =0x01; /* 清看门狗定时器 */
delay(10);
InitialCpu(); /* 初始化 */
lcd_init(); /* 初始化LCD1602 */
delay(10);
lcd_pos(0x00); /* 设置起始坐标 */
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]); //第一行字符显示
i++;
}
i=0;
while(1)
{
RSTSTAT = 0x01; /* 清看门狗定时器 */
if((P4&Bin(00000001))==0)
{
anjian=1;
}
if(anjian==1)
{
ISR_ADC();
AdcProcess();
// memset(str,0,sizeof(str));
sprintf(str,"JiaoDu:%.3f ",b);
// str[16]=0;
lcd_pos(0x00); /* 设置起始坐标 */
while(str[i] != '\0')
{
lcd_wdat(str[i]); //第一行字符显示
i++;
}
i=0;
}
else
{
lcd_pos(0x00); /* 设置起始坐标 */
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]); //第一行字符显示
i++;
}
i=0;
}
}
}
initial.c
#include <SH79F6431.h>
#include <definef.h>
#include "global.h"
#include <sinolib.h>
#include<intrins.h>
void Init_IO(void)
{
P0CR = Bin(11111111); /* P0为lcd控制口 */
P0 = Bin(00000000);
P1CR = Bin(11111111); /* P1为lcd数据口 */
P1 = Bin(00000000);
P4CR = Bin(11111111); /* P4.0为按键*/
P4 = Bin(11111111);
}
/*-----------------------------------------------------*/
void Init_ADC(void)
{
ADCON = Bin(10000000); /* 使能ADC模块 */
ADCH = Bin(00001111); /* P2.3 p2.4用作ADC通道0,1 */
ADT = 0xaf; /* 设置AD采样时间和时钟周期 */
ADCON |= Bin(00000001); /* 开始进行采样 */
}
void Init_IE(void)
{
// Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
IEN0 = Bin(01000000); //IEN0 EA EADC ET2 ES0 ET1 EX1 ET0 ---
IEN1 = Bin(00000000);//IEN1 ELPD ETW1 EPWM ES1 EHSEC EX3 EX2 ---
}
void InitialCpu(void)
{
EA = 0; //关闭全中断
PSW = 0; //clear PSW
Init_IO();
Init_ADC();
Init_IE();
EA = 1; //开启全中断
}
#include <SH79F6431.h>
#include <definef.h>
#include "global.h"
#include <intrins.h>
#include <math.h>
int AdcData=0;
uchar aa; /********转换数据******/
double pi=3.1415926;
//float smax=7;
//float r=7;
double a,b;
int x,y;
/************************AD采集***********************/
void ISR_ADC(void)
{
for(aa=4;aa>0;aa--)
{
ADCON=0x81;
while(ADCON==0x81);
AdcData+=ADDH<<2;
AdcData+=ADDL;
}
AdcData>>=2;
x=-(AdcData-565); /*1.83V=565*/
for(aa=4;aa>0;aa--)
{
ADCON=0x83;
while(ADCON==0x83);
AdcData+=ADDH<<2;
AdcData+=ADDL;
}
AdcData>>=2;
y=(AdcData-565); /*1.83V=565*/
}
ADC.c
void AdcProcess(void)
{
/***********************算角度***********************/
if((x<53)&&(x>-53)&&(y<53)&&(y>-53)) /*x,y霍尔电压在(1.66,2)V是,显示角度为0*/
b=0;
else
{
if(x>0)
{
if(y>0)
b=atan(x/y)+pi/2;
else
{
y=fabs(y);
b=atan(y/x)+pi;
}
}
else
{
if(y>0)
{
x=fabs(x);
b=atan(y/x);
}
else
{
x=fabs(x);
y=fabs(y);
b=atan(x/y)+(pi*3)/2;
}
}
b=b*180/pi;
}
}
新手求助啊~