找回密码
 立即注册

QQ登录

只需一步,快速开始

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

使用ch552 ADC采集电压,为什么没有显示ADC的数值

[复制链接]
跳转到指定楼层
楼主
ID:858009 发表于 2021-12-7 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qwettyuio 于 2021-12-7 15:51 编辑

主函数
#include "CH554.H"                                                   
#include "Debug.H"
#include "GPIO.H"
#include "HT1621.H"
#include "ADC.H"
#include "stdio.h"
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code tabe1[11] = {0xF0,0x00,0xD0,0x90,0x20,0xB0,0xF0,0x10,0xF0,0xB0};
uchar code tabe2[11] = {0xA0,0xA0,0x60,0xE0,0xE0,0xC0,0xC0,0xA0,0xE0,0xE0};

uchar a0,a1,a2,num;

/*******************************************************************************
* Function Name  : Show_Init()
* Description    : 显示对应的电压
*******************************************************************************/
void Show_Init(uchar a0,uchar a1,uchar a2)
{
        Write_1621(15,tabe1[a0],4);
        Write_1621(16,tabe2[a0],4);
        Write_1621(17,tabe1[a1],4);
        Write_1621(18,tabe2[a1],4);
        Write_1621(19,tabe1[a2],4);
        Write_1621(20,tabe2[a2],4);
}void main( )
{
        UINT16 i;
        ADCInit(0);
        EA=1;              //开启全局中断
        Init_1621();       //初始化HT1621
        HT1621_all_off();  //清空LCD显示
        while(1)
        {
                for(i=0;i<4;i++)
                {
                        ADC_ChannelSelect(3);         //ADC采样电源开启和通道设置,采样通道AIN3
                        ADC_START = 1;                //开启采样,等待采样完成进入中断
                        while(ADC_START);             //采样完成,ADC_START=0
                        num=ADC_DATA;
                        mDelaymS(100);                //等待,进入下通道采集数据
                }        
                a0=num/100;
                a1=num%100/10;
                a2=num%10;
                Show_Init(a0,a1,a2);
        }
}



代码.rar

118.3 KB, 下载次数: 3

代码

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

使用道具 举报

沙发
ID:752974 发表于 2021-12-7 16:17 | 只看该作者
这个需要从3个方面找原因:
1. 显示功能是否正常;
2. ADC工作是否正常;
3. 采集的数据是否送到了LCD上。
   三个环节缺一不可。
回复

使用道具 举报

板凳
ID:624769 发表于 2021-12-7 16:22 | 只看该作者
以下几点,核对一下:

ADC 采样模式配置步骤:
(1)、设置 ADC_CFG 寄存器中的 ADC_EN 位为 1,开启 ADC 模块,设置 bADC_CLK 选择频率。
(2)、设置 ADC_CTRL 寄存器中的 ADC_CHAN1/0,选择输入通道。
(3)、可选的,清零中断标志 ADC_IF。可选的,如果使用中断模式,还需要在此使能中断。
(4)、设置 ADC_CTRL 寄存器中的 ADC_START,启动一次 ADC 转换。
(5)、等待 ADC_START 变为 0,或者 ADC_IF 被置 1(如果之前已清零),表示 ADC 转换结束,可通过
ADC_DATA 读取结果数据。该数据是输入电压相对于 VCC 电源电压的 255 等份的值,例如,结 果数据是 47,说明输入电压接近 VCC 电压的 47/255。如果 VCC 电源电压也不确定,那么可以 另测一个确定的参考电压值,再按比例计算出被测的输入电压值和 VCC 电源电压值。
(6)、如果再次设置 ADC_START 则可启动下一次 ADC 转换。

另外,重点:
端口模式,必须设置为输入并且处于输出 1 的状态(相当于高阻输入),Pn_DIR_PU[x]=0,并且建议关闭上拉电阻和下拉电阻。
回复

使用道具 举报

地板
ID:858009 发表于 2021-12-7 16:41 | 只看该作者
188610329 发表于 2021-12-7 16:22
以下几点,核对一下:

ADC 采样模式配置步骤:

按照官方给的文件使用ADC,找不出问题错在哪一步?这是调用的文件函数,求指点一下

/********************************** (C) COPYRIGHT *******************************
* File Name          : ADC.C
* Author             : WCH
* Version            : V1.0
* Date               : 2019/07/22
* Description        : CH554 ADC采样时钟设置,ADC通道设置函数,电压比较模式设置
*******************************************************************************/

#include "..\Public\CH554.H"                                                         
#include "..\Public\Debug.H"
#include "ADC.H"
#include "stdio.h"

#pragma  NOAREGS

#define ADC_INTERRUPT  1
UINT16 UserData;
/*******************************************************************************
* Function Name  : ADCInit(UINT8 div)
* Description    : ADC采样时钟设置,模块开启,中断开启
* Input          : UINT8 div 时钟设置
                   1 慢  384个Fosc                                                                                  
                   0 快  96个Fosc                                                                         
* Output         : None
* Return         : None
*******************************************************************************/
void ADCInit(UINT8 div)
{
    ADC_CFG &= ~bADC_CLK | div;
    ADC_CFG |= bADC_EN;                                                        //ADC电源使能
#if ADC_INTERRUPT
    ADC_IF = 0;                                                                //清空中断
    IE_ADC = 1;                                                                //使能ADC中断
#endif
}

/*******************************************************************************
* Function Name  : ADC_ChannelSelect(UINT8 ch)
* Description    : ADC采样启用
* Input          : UINT8 ch 采用通道
* Output         : None
* Return         : 成功 SUCCESS
                   失败 FAIL
*******************************************************************************/
UINT8 ADC_ChannelSelect(UINT8 ch)
{
    if(ch == 0){ADC_CHAN1 =0;ADC_CHAN0=0;P1_DIR_PU &= ~bAIN0;}                 //AIN0
    else if(ch == 1){ADC_CHAN1 =0;ADC_CHAN0=1;P1_DIR_PU &= ~bAIN1;}            //AIN1
    else if(ch == 2){ADC_CHAN1 =1;ADC_CHAN0=0;P1_DIR_PU &= ~bAIN2;}            //AIN2
    else if(ch == 3){ADC_CHAN1 =1;ADC_CHAN0=1;P3_DIR_PU &= ~bAIN3;}            //AIN3
    else return FAIL;
    return SUCCESS;
}

/*******************************************************************************
* Function Name  : VoltageCMPModeInit()
* Description    : 电压比较器模式初始化
* Input          : UINT8 fo 正向端口 0\1\2\3
                   UINT8 re 反向端口 1\3
* Output         : None
* Return         : 成功 SUCCESS
                   失败 FAIL
*******************************************************************************/
UINT8 VoltageCMPModeInit(UINT8 fo,UINT8 re)
{
    ADC_CFG |= bCMP_EN;                                                        //电平比较电源使能
    if(re == 1){
      if(fo == 0) {ADC_CHAN1 =0;ADC_CHAN0=0;CMP_CHAN =0;}                      //AIN0和AIN1
      else if(fo == 2) {ADC_CHAN1 =1;ADC_CHAN0=0;CMP_CHAN =0;}                 //AIN2和AIN1
      else if(fo == 3) {ADC_CHAN1 =1;ADC_CHAN0=1;CMP_CHAN =0; }                //AIN3和AIN1                       
      else return FAIL;
    }                             
    else if(re == 3){
      if(fo == 0) {ADC_CHAN1 =0;ADC_CHAN0=0;CMP_CHAN =0;}                      //AIN0和AIN1
      else if(fo == 1) {ADC_CHAN1 =0;ADC_CHAN0=1;CMP_CHAN =0;}                 //AIN1和AIN1
      else if(fo == 2) {ADC_CHAN1 =1;ADC_CHAN0=0;CMP_CHAN =0;}                 //AIN2和AIN1                       
      else return FAIL;
    }
    else return FAIL;
#if ADC_INTERRUPT
    CMP_IF = 0;                                                                //清空中断
    IE_ADC = 1;                                                                //使能ADC中断
#endif

     return SUCCESS;
}

#if ADC_INTERRUPT
/*******************************************************************************
* Function Name  : ADCInterrupt(void)
* Description    : ADC 中断服务程序
*******************************************************************************/
void        ADCInterrupt( void ) interrupt INT_NO_ADC using 1                       //ADC中断服务程序,使用寄存器组1
{
    if(ADC_IF ==  1)                                                          //ADC完成中断
    {
      UserData = ADC_DATA;                                                    //取走ADC采样数据
      ADC_IF = 0;                                                                          //清空ADC中断标志
          printf(" %d ",UserData);
    }
    if(CMP_IF ==  1)                                                          //电压比较完成中断
    {       
//       UserData = ADC_CTRL&0x80 >> 7);                                                //保存比较器结果               
      CMP_IF = 0;                                                                          //清空比较器完成中断
    }
}
#endif
回复

使用道具 举报

5#
ID:858009 发表于 2021-12-7 17:20 | 只看该作者
188610329 发表于 2021-12-7 16:22
以下几点,核对一下:

ADC 采样模式配置步骤:

按照这个步骤写的,文件里有完整的代码,希望大佬可以指点一下解决
回复

使用道具 举报

6#
ID:624769 发表于 2021-12-7 17:25 | 只看该作者
qwettyuio 发表于 2021-12-7 17:20
按照这个步骤写的,文件里有完整的代码,希望大佬可以指点一下解决

如果完全按照这个流程,也设置了端口方向,硬件连线也正确的话, 采集不可能有问题的,你采集出来的结果是什么? 有用串口回传电脑的串口助手么?
回复

使用道具 举报

7#
ID:57657 发表于 2021-12-9 17:51 | 只看该作者
你先将ADC转换结果通过串口发送出去,没问题了再加LCD的程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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