找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1764|回复: 6
打印 上一主题 下一主题
收起左侧

大神们,求指教ADC比较问题

[复制链接]
跳转到指定楼层
楼主
想照猫画虎做个追光系统,ADC采集没问题了,可是本人太菜不会做比较,我的意思是比较两个ADC数值若差大于一定值舵机就增加一定脉冲。应该怎么写,谢谢了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:321930 发表于 2020-1-19 21:47 | 只看该作者
刚开始简单写成if(adc1-adc2>10){jiaodu++;}编译通过不了,没学过C
回复

使用道具 举报

板凳
ID:592807 发表于 2020-1-20 11:56 | 只看该作者
这两句没错,估计其他地方错了,你要把错误提示发出来
回复

使用道具 举报

地板
ID:679425 发表于 2020-1-20 13:36 | 只看该作者
编译时的错误提示
回复

使用道具 举报

5#
ID:553941 发表于 2020-1-20 14:10 | 只看该作者
你要提供错误信息和源码呀,不然怎么知道你哪的错
回复

使用道具 举报

6#
ID:321930 发表于 2020-1-28 16:54 | 只看该作者



#include    "config.h"
#include    "adc.h"
#include    "delay.h"
//#include    "soft_uart.h"
#include    "pcf8574lcd.h"
unsigned int scale1;//占空比控制变量
unsigned int scale2;//占空比控制变量
sbit out1=P3^6;
sbit out2=P3^7;
sbit key1=P3^5;
sbit key2=P3^4;
sbit key3=P3^3;
sbit key4=P3^2;

unsigned int kf1=1;//按键用的标志位
unsigned int kt1=0;//按键用的标志位
unsigned int kf2=1;//按键用的标志位
unsigned int kt2=0;//按键用的标志位
unsigned int num1=50;
unsigned int num2=25;
unsigned int ADC1;//上
unsigned int ADC2;//下
unsigned int ADC3;//左
unsigned int ADC4;//右
unsigned int ADC5;//电压
volatile uint8 data display_buffer1[16];    //显示缓冲区1
volatile uint8 data display_buffer2[16];    //显示缓冲区2
                             




void timer0() interrupt 1{//定时器0 0中断服务程序
    static unsigned int tt1,tt2;//tt用来保存当前时间在一秒中的比例位置
    tt1++;
    tt2++;
     //每10微妙增加1
    if(tt1==150){//2.5毫秒的时钟周期
        tt1=0;//使tt=0,开始新的PWM周期
        out1=0;
         
    }
    if(tt2==150){//2.5毫秒的时钟周期
        tt2=0;//使tt=0,开始新的PWM周期
        out2=0;
         
    }
    if(scale1==tt1){//按照当前占空比铁环输出为高电平
out1=1;        
    }
    if(scale2==tt2){//按照当前占空比铁环输出为高电平
        
out2=1;
    }
}


void    ADC_config(void)
{
    ADC_InitTypeDef        ADC_InitStructure;                //结构定义
    ADC_InitStructure.ADC_Px        = ADC_P10 | ADC_P11 | ADC_P12 | ADC_P13 | ADC_P14 ;    //设置要做ADC的IO,    ADC_P10 ~ ADC_P17(或操作),ADC_P1_All
    ADC_InitStructure.ADC_Speed     = ADC_540T;            //ADC速度            ADC_90T,ADC_180T,ADC_360T,ADC_540T
    ADC_InitStructure.ADC_Power     = ENABLE;            //ADC功率允许/关闭    ENABLE,DISABLE
    ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2;        //ADC结果调整,    ADC_RES_H2L8,ADC_RES_H8L2
    ADC_InitStructure.ADC_Polity    = PolityLow;        //优先级设置    PolityHigh,PolityLow
    ADC_InitStructure.ADC_Interrupt = DISABLE;            //中断允许        ENABLE,DISABLE
    ADC_Inilize(&ADC_InitStructure);                    //初始化
    ADC_PowerControl(ENABLE);                            //单独的ADC电源操作函数, ENABLE或DISABLE
}




void ADC_zhuanhuan(void)
{
u8 a,b,c,d;
ADC1=Get_ADC10bitResult(0);//上下左右  电压
ADC2=Get_ADC10bitResult(1);
ADC3=Get_ADC10bitResult(2);
ADC4=Get_ADC10bitResult(3);
ADC5=Get_ADC10bitResult(4);
a=ADC1/11;
b=ADC2/11;
c=ADC3/11;
d=ADC4/11;


}

/**************************************************************
更新显示缓冲区
***************************************************************/
void updata_buffer(void)
{
//显示日期
    u8 a,b,c,d;

   display_buffer1[0] = 'S';
   display_buffer1[1] = ':';
    display_buffer1[2] = a/10+0x30;        //年
    display_buffer1[3] = a%10+0x30;
   display_buffer1[4] = ' ';
   display_buffer1[5] = 'X';
   display_buffer1[6] = ':';
    display_buffer1[7] = b/10+0x30;        //年
    display_buffer1[8] = b%10+0x30;
   display_buffer1[9] = ' ';
   display_buffer1[10] = ' ';
   display_buffer1[11] = ' ';
   display_buffer1[12] = ' ';
   display_buffer1[13] = ' ';
   display_buffer1[14] = num1/10+0x30;
   display_buffer1[15] = num1%10+0x30;

   display_buffer2[0] = 'Z';
   display_buffer2[1] = ':';
    display_buffer2[2] = c/10+0x30;        //年
    display_buffer2[3] = c%10+0x30;
   display_buffer2[4] = ' ';
   display_buffer2[5] = 'Y';
   display_buffer2[6] = ':';
    display_buffer2[7] = d/10+0x30;        //年
    display_buffer2[8] = d%10+0x30;
   display_buffer2[9] = ' ';
   display_buffer2[10] = ' ';
   display_buffer2[11] = ' ';
   display_buffer2[12] = ' ';
   display_buffer2[13] = ' ';
   display_buffer2[14] = num2/10+0x30;
   display_buffer2[15] = num2%10+0x30;

  
   

   

}
/******************************************************************
显示缓冲区内容
*******************************************************************/
void display_buffer(void)
{
    uint8 i ;
    send_command(0x80) ;    //显示第一行
    for(i=0;i<16;i++)
    send_data(display_buffer1[i]);
    send_command(0xc0) ;   //显示第二行
    for(i=0;i<16;i++)
    send_data(display_buffer2[i]);
}

/*****************************************************/
/**********************************************/
void main(void)
{
    u8 a,b,c,d;
  
TMOD=0x02;//定时器0,工作模式2(0000,0010),8位定时模式
    TL0 = 0xec;        //设置定时初值   20微妙
    TH0 = 0xec;        //设置定时重载值
    TR0=1;//启动定时器
    ET0=1;//允许定时器0中断
    EA=1;//允许总中断


lcd_open();   
init_lcd() ;   
   
    while (1)
    {
    updata_buffer();

    display_buffer();
      ADC_zhuanhuan();
/**********************************************/
   


    if(a-b>=10){
      num1++;
   
        if(num1>99)
           {
             num1=99;
                  }
                  }
/**********************************************/
/**********************************************/
      
    if(b-a>=10){
      num1--;
   
        if(num1<50)
           {
             num1=50;
                  }
                  }
/**********************************************/
/**********************************************/
      
    if(c-d>=10){
      num2++;
   
        if(num2>99)
           {
             num2=99;
                  }
                  }
/**********************************************/
/**********************************************/
      
    if(d-c>=10){
      num2--;

        if(num2<25)
           {
             num2=25;
                  }
                  }
/**********************************************/
           if(key1==0){
                num1=50;
                scale1=25;            
             }
        if(key2==0){//当按键1按下
            if(kf1){//当标志位kf0=1的时候进行
                    kf1=0;//标志位kf0=0
                    kt1=1;//标志位kt0=0
                    num1++;
              }
        }else{//当按键松开
           if(kt1){//当标志位kt0=1的时候进行
                kf1=1;//标志位kf0=1
                kt1=0;//标志位kt0=0
           }
        }//按键1结束
          if(key3==0){//当按键1按下
            if(kf2){//当标志位kf0=1的时候进行
                    kf2=0;//标志位kf0=0
                    kt2=1;//标志位kt0=0
                    num1--;
              }
        }else{//当按键松开
           if(kt2){//当标志位kt0=1的时候进行
                kf2=1;//标志位kf0=1
                kt2=0;//标志位kt0=0
           }
        }//按键1结束
        if(key4==0){
                num1=99;
            
        }
         
        scale1=num1+25;        
        scale2=num2+25;
    //           ADC_soft_uart();
     }
}
大神们过年好,程序是这样的,无法通过作比较使得程序中的角度进行加减,num1和num2的值一直保持不变,按键是正常的,程序可以通过编译了


IMG_20200128_164624.jpg (3.06 MB, 下载次数: 28)

IMG_20200128_164624.jpg
回复

使用道具 举报

7#
ID:321930 发表于 2020-1-28 17:09 | 只看该作者
SXZY分别代表上下左右,右侧两个值就是角度
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表