打印
[STM32F1]

ADC端口电压莫名其妙下降

[复制链接]
1254|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用STM32F103VET6单片机内部ADC采集电压,使用了12路,但是其中有一路电压莫名其妙下降。采样电路如图:
采用电阻分压采集24V电压,R35电阻10K与150K分压大约1.4V,到达单片机端口的电压只有0.28V,怀疑端口吸收了电流。
其他11路都正常只有这一路不正常,电路都是一样的,多块电路板都一样的问题,电路板也重新打样过,问题依旧,应该不是硬件问题,但是程序上也检查不出问题。
请大神解答。

使用特权

评论回复
沙发
Cjy_JDxy| | 2019-7-14 14:07 | 只看该作者
不是硬件问题,那就是软件问题了。贴出你的程序

使用特权

评论回复
板凳
黑洞不黑|  楼主 | 2019-7-14 17:27 | 只看该作者
本帖最后由 黑洞不黑 于 2019-7-14 17:32 编辑

//初始化ADC端口
void ADC_IO_init(void)
{
        RCC->APB2ENR|=1<<2;    //使能PORTA时钟
        RCC->APB2ENR|=1<<3;    //使能PORTB时钟
        RCC->APB2ENR|=1<<4;    //使能PORTC时钟
        
        GPIOA->CRL&=0X0000FFFF;//PA4-PA7 模拟输入
        GPIOB->CRL&=0XFFFFFF00;//PB0-PB1 模拟输入
        GPIOC->CRL&=0XFF000000;//PC0-PC5 模拟输入
}
//初始化ADC
void ADC_init(void)
{   
        //先初始化IO口
         ADC_IO_init();
//        //通道13设置        
        RCC->APB2ENR|=1<<9;    //ADC1时钟使能         
        RCC->APB2RSTR|=1<<9;   //ADC1复位
        RCC->APB2RSTR&=~(1<<9);//复位结束        
//        //SYSCLK/DIV2=12M ADC时钟设置为12M(6分频),ADC最大时钟不能超过14M!
//        //否则将导致ADC准确度下降!         
        RCC->CFGR&=~(3<<14);   //分频因子清零
        RCC->CFGR|=2<<14;      //ADC6分频
        ADC1->CR1&=0XF0FFFF;   //工作模式清零
        ADC1->CR1|=0<<16;      //独立工作模式
        ADC1->CR1&=~(1<<8);    //非扫描模式        
        ADC1->CR2&=~(1<<1);    //单次转换模式           
        ADC1->CR2&=~(7<<17);           
        ADC1->CR2|=7<<17;           //软件控制转换
        ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!!        必须使用一个事件来触发     
        ADC1->CR2&=~(1<<11);   //右对齐                          
        ADC1->SQR1&=~(0XF<<20);
        ADC1->SQR1|=12<<20;     //12个转换在规则序列中
//                                    
//        //设置通道1的采样时间  
         ADC1->SMPR2=0x3ffff000;     //通道4-9  239.5周期,提高采样时间可以提高精确度        
         ADC1->SMPR2=0x0003ffff;     //通道10-15  239.5周期,提高采样时间可以提高精确度
        ADC1->CR2|=1<<0;           //打开AD转换器
        ADC1->CR2|=1<<3;       //使能复位校准
        while(ADC1->CR2&1<<3); //等待校准结束                          
//    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。         
        ADC1->CR2|=1<<2;        //开启AD校准            
        while(ADC1->CR2&1<<2);  //等待校准结束
        MY_NVIC_Init(1,0,ADC1_2_IRQn,1);//抢占优先级0,子优先级0,组0
        
        ADC1->CR1|=1<<5;        //打开规则转换中断
//        ADC1->SQR3=0xffffffe0;     //选择规则序列1
        ADC1->SQR3|=ADC_ch;                                             
        ADC1->CR2|=1<<22;       //启动规则转换通道
}
这是ADC相关的初始化程序,用的中断读取ADC数值,第一版的时候没发现问题,后面就有问题了,而且是有时候不行有时候正常

使用特权

评论回复
地板
Cjy_JDxy| | 2019-7-15 09:57 | 只看该作者
好厉害呀,还用寄存器编程。

使用特权

评论回复
5
sohowork| | 2019-7-15 13:48 | 只看该作者
你查一下datasheet,看ST推荐的ADC输入阻抗最大不超过多少?

使用特权

评论回复
6
黑洞不黑|  楼主 | 2019-7-15 15:04 | 只看该作者
sohowork 发表于 2019-7-15 13:48
你查一下datasheet,看ST推荐的ADC输入阻抗最大不超过多少?

一时半会没查到,现在奇怪的是只有这一个通道有问题,其他11个通道没问题,而且是有时正常有时不正常

使用特权

评论回复
7
changm1| | 2019-7-15 19:19 | 只看该作者
估计这个端口被配置成别的模式了,建议检查IO配置

使用特权

评论回复
8
黑洞不黑|  楼主 | 2019-7-16 13:13 | 只看该作者
changm1 发表于 2019-7-15 19:19
估计这个端口被配置成别的模式了,建议检查IO配置

我也怀疑是这个问题,检查了所有的IO口配置,检查不出问题

使用特权

评论回复
9
lihui567| | 2019-7-17 09:26 | 只看该作者
硬件问题不大,你可以测一下你的1K电阻上压降,知道电流多大,看看是哪里问题

使用特权

评论回复
10
wangjiahao88| | 2019-7-18 10:55 | 只看该作者
感觉你的电路 不对啊%

使用特权

评论回复
11
wangjiahao88| | 2019-7-18 10:55 | 只看该作者
把1K电阻直接短接一下 试试吧!

使用特权

评论回复
12
香水城| | 2019-7-18 11:33 | 只看该作者
好好检查下该管脚的配置,查查有无跟其它脚冲突。

使用特权

评论回复
13
renzheshengui| | 2019-8-8 12:58 | 只看该作者
带载的问题吧

使用特权

评论回复
14
wakayi| | 2019-8-8 13:00 | 只看该作者
引脚如何配置的啊

使用特权

评论回复
15
wowu| | 2019-8-8 13:04 | 只看该作者
阻抗匹配的问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

110

帖子

2

粉丝