微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助:AD转换程序好像有问题,大神帮忙看看

求助: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;
        }
}

新手求助啊~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top