找回密码
 立即注册
查看: 383|回复: 8

ADC转换不成功

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-06-15 19:03:36
已绑定手机

54

主题

39

回帖

562

积分

高级会员

积分
562
发表于 2025-2-16 10:42:36 | 显示全部楼层 |阅读模式

CPU采用 STC32G12K328之 46 腿 P03 输入 2.5V;VREF = 5V

void ADC_Isr() interrupt 5
{
        ADC_FLAG = 0;                                                                                                                // 清零ADC中断标志
        adc_result = ADC_RES*256 + ADC_RESL;                // 读取ADC转换结果
        ADC_START = 1;                                                                                                        // 启动ADC转换
        adc_i = adc_i + 1 ;
}
void ADC_Config()
{
        P0M1 = 0x08;P0M0 = 0x00;                // P0.3设置为高阻输入模式
        ADC_CONTR &= 0xF0;                                       
        ADC_CONTR |= 0x0B;                                        // 设置ADC通道为P0.3
//        ADCTIM = 0x3F;                                                        // ADC时序设置:通道选择时间:1个时钟,通道保持时间:4个时钟,采样时间:32个时钟
//        ADCCFG = 0x0F;                                                // ADC频率设置:系统时钟/2/16,数据左对齐
//        ADCCFG = 0x2F;                                                        // ADC频率设置:系统时钟/2/16,数据右对齐
        ADCCFG &= ~0x0f;
        ADCCFG |= 0x02;                        //SPEED(2)
        ADCTIM = 0x35;                        //CSSETUP(0), CSHOLD(1), SMPDUTY(21)
        ADC_POWER = 1;                                                        // 使能ADC
        EADC = 1;                                                                                // 使能ADC中断
}

//=================================================================
                        delay_ms(1000);


                        rs1_tx(0x55);                        
                        rs1_tx(0x55);                        
                        rs1_tx(0x55);                        
                        rs1_tx(0x55);
                        nn = adc_result ;
                        iii = adc_i ;
                        adc_i = 0 ;
                        rs1_tx((iii >> 8 >> 8 >> 8)&0xff);                        
                        rs1_tx((iii >> 8 >> 8)&0xff );                        
                        rs1_tx((iii >> 8 )&0xff );                        
                        rs1_tx(iii&0xff);                        
                        rs1_tx((nn >> 8 )&0xff );                        
                        rs1_tx(nn&0xff);                        


结果显示全是0













回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

733

主题

1万

回帖

1万

积分

管理员

积分
16661
发表于 2025-2-16 11:43:58 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-17 08:23:30
已绑定手机

14

主题

1312

回帖

3302

积分

论坛元老

积分
3302
发表于 2025-2-16 11:56:38 | 显示全部楼层
adc_i有没有增加?把采样速率再大幅降低试试呢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-06-15 19:03:36
已绑定手机

54

主题

39

回帖

562

积分

高级会员

积分
562
发表于 2025-2-16 13:08:33 | 显示全部楼层
没有增加,全是0
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-06-15 19:03:36
已绑定手机

54

主题

39

回帖

562

积分

高级会员

积分
562
发表于 2025-2-16 13:09:33 | 显示全部楼层
采用速率已经是最低了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-17 10:15:05

74

主题

6092

回帖

1万

积分

超级版主

积分
12731
发表于 2025-2-16 13:51:07 | 显示全部楼层
ADCCFG |= 0x02;    //ADC时钟 = FOSC/2/3
ADCTIM = 0x35;     // SETUP = 1, CSHOLD = 2, SMPDUTY = 22,12为ADC转换时间固定为12
你的初始化ADC时钟为FOSC/6,ADC转换时间为(1+2+22+12)=37个ADC时钟,你没有提供主频,假设你使用24MHz,则ADC时钟为4MHz,ADC时间为37/4=9.25us。加上中断响应总时间大约为10~12us。

没看到你第一次在哪里启动ADC转换的?
假设你在别的地方启动了第一次ADC转换,则ADC中断里重复启动ADC转换,转换时间大约为10~12us,这么快的速度串口没法实时上传的。

请先用官方例子测试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-06-15 18:32:25
已绑定手机

5

主题

57

回帖

247

积分

中级会员

积分
247
发表于 2025-2-16 16:22:01 | 显示全部楼层
梁*** 发表于 2025-2-16 13:51
ADCCFG |= 0x02;    //ADC时钟 = FOSC/2/3
ADCTIM = 0x35;     // SETUP = 1, CSHOLD = 2, SMPDUTY = 22 ...

梁工你好,说明书上公式如下,同你估算的有些不一样,你估算的没加1,speed也没算进去,正常情况需按下面的公式来套对吗?
                             sysclk
_________________________________________________
2*(speed+1)*[(cssetup+1)+(cshold+1)+(smpduty+1)+12]

点评

我的计算没有错,你再仔细看,我上面的参数是+1了的,你的设置是: 你设置SETUP=0,则SETUP时钟=1, 你设置CSHOLD=1,则CSHOLD时钟=2, 你设置SMPDUTY = 21,则SMPDUTY时钟为22。 ADC转换时间为12。 所以你的ADC总时  详情 回复 发表于 2025-2-16 16:37
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-17 10:15:05

74

主题

6092

回帖

1万

积分

超级版主

积分
12731
发表于 2025-2-16 16:37:22 | 显示全部楼层
xxw*** 发表于 2025-2-16 16:22
梁工你好,说明书上公式如下,同你估算的有些不一样,你估算的没加1,speed也没算进去,正常情况需按下面 ...

我的计算没有错,你再仔细看,我上面的参数是+1了的,你的设置是:
你设置SETUP=0,则SETUP时钟=1,
你设置CSHOLD=1,则CSHOLD时钟=2,
你设置SMPDUTY = 21,则SMPDUTY时钟为22。
ADC转换时间为12。
所以你的ADC总时间 = (1+2+22+12)=37个ADC时钟。
你的SPEED设置为2,则ADC时钟频率=FOSC/2/3。

建议一下,初始化寄存器时,尽量不要直接给十六进制值,不好读,可以使用我下面的宏定义,容易读懂,最重要的是不容易出错,也不用再取翻看手册寄存器:

/********************** ADC初始化函数 ************************/
#define D_ADC_POWER        (1<<7)        /* ADC电源,1开启,0关闭 */
#define D_ADC_START        (1<<6)        /* 启动转换,自动清0 */
#define D_ADC_FLAG        (1<<5)        /* 完成标志,软件清0 */
#define D_ADC_EPWMT        (1<<4)        /* 允许PWMA触发ADC */

#define        D_ADC_SPEED        5                /* 0~15, ADC时钟 = SYSclk/2/(n+1) */
#define        D_RES_FMT        (1<<5)        /* ADC结果格式 0: 左对齐, ADC_RES: D9 D8 D7 D6 D5 D4 D3 D2, ADC_RESL: D1 D0 0  0  0  0  0  0 */
                                                        /*             1: 右对齐, ADC_RES: 0  0  0  0  0  0  D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */
#define CSSETUP                (1<<7)        /* 0~1,  ADC通道选择时间      0: 1个ADC时钟, 1: 2个ADC时钟,  默认0(默认1个ADC时钟)        */
#define CSHOLD                (1<<5)        /* 0~3,  ADC通道选择保持时间  (n+1)个ADC时钟, 默认1(默认2个ADC时钟)                                        */
#define SMPDUTY                20                /* 10~31, ADC模拟信号采样时间  (n+1)个ADC时钟, 默认10(默认11个ADC时钟)                                */
                                                        /* ADC转换时间: 10位ADC固定为10个ADC时钟, 12位ADC固定为12个ADC时钟.                                 */
void        ADC_config(void)
{
//        EAXFR = 1;        //SFR enable
        P1n_pure_input(1<<CHANNEL);        //设置要做ADC的IO做高阻输入
        ADC_CONTR = D_ADC_POWER + CHANNEL;        //ADC on + channel
        ADCCFG = D_RES_FMT + D_ADC_SPEED;
        ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
//        ADC_START   =  1;        //启动ADC转换, 完成后自动清零
//        ADC_FLAG    =  0;        //清除ADC完成(中断)标志
//        ADC_EPWMT   =  1;        //允许PWM触发ADC
//        EADC  = 1;        //允许ADC中断
//        PADCH = 1;        //ADC 中断优先级高位
//        PADC  = 1;        //ADC 中断优先级
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-06-15 18:32:25
已绑定手机

5

主题

57

回帖

247

积分

中级会员

积分
247
发表于 2025-2-16 17:53:09 | 显示全部楼层
谢谢梁工
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 15:22 , Processed in 0.137063 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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