找回密码
 立即注册
查看: 351|回复: 3

ADC函数运行感觉和USB函数有冲突,求大神指教

[复制链接]

该用户从未签到

13

主题

25

回帖

141

积分

注册会员

积分
141
发表于 2023-7-28 20:44:55 | 显示全部楼层 |阅读模式
#include "adc.h"
#include "intrins.h"
void ADC_Init()
{
        P1M0 = 0x00;
        P1M1 = 0x01;   //设置P10高阻输入,ADC采集必须使用高阻输入
       
        ADCTIM = 0X3F; //设置ADC内部时序
        ADCCFG = 0X2f; //设置adc时钟为系统时钟/2/16,一般选用速度最慢的模式,求数据稳定,数据选用右对齐格式.0010 1111右对齐,2/16时钟频率
        ADC_POWER = 1; //使能ADC模块

}
//=============================================
//函数名称 ADC_Read
//函数功能 ADC读取指定通道电压
//入口参数 @ no,ADC选择通道0-15
//函数返回 ADC_Val
//当前版本 VER1.0
//修改日期 2023
//当前作者
//其他备注
//=============================================
u16 ADC_Read(u8 no)//入口参数为选择ADC通道
{
        u16 Adc_Val;        //ADC数据保存变量
//        ADC_CONTR &= 0x0f; //清空通道寄存器
        ADC_CONTR |= no;   //选择通道0-15,最后一位通道默认测试通道,选择通道时为了不修改寄存器(ADC_POWER,ADC_START,_ADC_FLAG,ADC_EPWMT)前四位的值,故而|=。
        ADC_START = 1;      //启动AD转换
        _nop_();            //运行两行空指令
        _nop_();
        while(!ADC_FLAG);   //等待ADC转换结束标志位,由硬件置1.
        ADC_FLAG = 0;       //ADC转换结束标志位由软件清零
        Adc_Val = ((ADC_RES<<8)+ADC_RESL); //高位左右8位后加低八位就是ADC的值
        return Adc_Val;
}
这是函数定义
下面是函数调用
//主函数入口
void main()
{   
          u16 ADC_VAL ;
          ADC_Init();
          EA = 1;                 //打开总中断
    sys_init();  //系统初始化
    usb_init();  //USB CDC 接口配置  
//        SEG0 = 0;
//        SEG1 = 0;
//死循环   
        while (1)
        {               
                P40=0;
                P60=0;                  
                delay_ms(2);
            if(DeviceState != DEVSTATE_CONFIGURED)  //等待USB完成配置
        continue;               
//        if (bUsbOutReady)
//        {
//            usb_OUT_done();    //接收应答(固定格式)
//         
//                              printf("%d\r\n",ADC_VAL);
//            memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);  //将接收数据(UsbOutBuffer),复制到发送缓冲区(UsbInBuffer)
//            usb_IN(OutNumber);      //原路返回, 用于测试
//        }
//              ADC_VAL = ADC_Read(0);      //选择ADC通道0读取到ADC值赋值给ADC_VAL
                    printf("%d\r\n",(int)ADC_VAL);
                                printf("%d\r\n",P6);                                       
    }
}
红色代码部分屏蔽掉可以打印ADC_VAL的值是0 ,如果不屏蔽,串口什么也不打印。这个函数调用貌似跟USB串口有冲突,或者程序卡在了哪个死循环。求解

回复 送花

使用道具 举报

该用户从未签到

13

主题

25

回帖

141

积分

注册会员

积分
141
 楼主| 发表于 2023-7-28 20:54:24 | 显示全部楼层
后来多次测试时这个ADC采集函数有问题,我读ADC_RES和ADC_RESL 串口都不打印。求指导这个ADC_Read()函数问题出在哪里。不要截图手册拉,你就直接说我问题出哪里了,手册我也翻了,查询的话按手册能读到ADC,这个代码是跟着冲哥的视屏写的,一模一样的,为啥他没问题,我有问题。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

25

回帖

141

积分

注册会员

积分
141
 楼主| 发表于 2023-7-28 21:25:57 | 显示全部楼层
u16 ADC_Read(u8 no)//入口参数为选择ADC通道
{
        u16 Adc_Val;        //ADC数据保存变量
//        ADC_CONTR &= 0x0f; //清空通道寄存器
        ADC_CONTR |= no;   //选择通道0-15,最后一位通道默认测试通道,选择通道时为了不修改寄存器(ADC_POWER,ADC_START,_ADC_FLAG,ADC_EPWMT)前四位的值,故而|=。
        ADC_START = 1;      //启动AD转换
        _nop_();            //运行两行空指令
        _nop_();
        while(!ADC_FLAG);   //等待ADC转换结束标志位,由硬件置1.
        ADC_FLAG = 0;       //ADC转换结束标志位由软件清零
        Adc_Val = (ADC_RES<<8)+ADC_RESL; //高位左右8位后加低八位就是ADC的值
        return Adc_Val;
}

u16 ADC_Get(u8 i)
{
       
        u16 ADC_Val;
        ADC_CONTR |= i;
    ADC_START = 1;
        _nop_();            //运行两行空指令
        _nop_();
        while(!ADC_FLAG);
        ADC_FLAG = 0;
        ADC_Val = (ADC_RES<<8)+ADC_RESL;
        return ADC_Val;
}
函数定义
下面是调用
void main()
{   
          u16 ADC_VAL ;
          ADC_Init();
          EA = 1;                 //打开总中断
    sys_init();  //系统初始化
    usb_init();  //USB CDC 接口配置  
//        SEG0 = 0;
//        SEG1 = 0;
//死循环   
        while (1)
        {               
                P40=0;
                P60=0;                  
                delay_ms(2);
            if(DeviceState != DEVSTATE_CONFIGURED)  //等待USB完成配置
        continue;               
//        if (bUsbOutReady)
//        {
//            usb_OUT_done();    //接收应答(固定格式)
//         
//                              printf("%d\r\n",ADC_VAL);
//            memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);  //将接收数据(UsbOutBuffer),复制到发送缓冲区(UsbInBuffer)
//            usb_IN(OutNumber);      //原路返回, 用于测试
//        }
//                ADC_VAL = ADC_Read(0);      //选择ADC通道0读取到ADC值赋值给ADC_VAL
                    ADC_VAL = ADC_Get(0);
                    printf("%d\r\n",(int)ADC_VAL);
                        printf("%d\r\n",P6);                                       
    }
}
ADC_Read调用了串口不打印,
ADC_Get调用了串口就可以打印,
求大神答疑。感觉两个函数一模一样啊,怎么代码跑出来的结果就不一样了呢
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

25

回帖

141

积分

注册会员

积分
141
 楼主| 发表于 2023-7-28 21:38:20 | 显示全部楼层
应该是ISP下载软件的问题,下两次后两个函数都能读了,但是ADC结果跟冲哥的视屏不一样,他是0和1这样跳动,我是2468-2470这样调到,都是9.6的试验箱,想知道为啥。
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-16 22:17 , Processed in 0.056642 second(s), 40 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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