16F88单片机ADC读取10K电位器无法全量程响应故障求助
故障根因与修复方案
1 核心问题(匹配你描述的仅最后5%量程响应的现象)
- ADC输入引脚配置错误:AN0采样通道对应RA0引脚,你代码中
set_tris_a(0x00)将PORTA所有引脚设为输出模式,ADC引脚无法正常采集外部电位器电压,只有当电位器输出电压超出GPIO输出电平阈值时,采样值才会产生变化。 - ADC采样变量类型不匹配:你开启了10位ADC配置
#device ADC=10,READ_ADC()返回的是0~1023范围的10位无符号数,但全局变量adc0被定义为默认8位int,赋值时会直接截断高2位,丢失3/4的量程信息。 - 速度映射区间范围过小:当前区间判断仅覆盖了0256的数值范围,和10位ADC的01023量程完全不匹配,就算引脚配置正确也无法覆盖电位器全行程。
2 修复步骤
- 修正PORTA方向配置,将RA0设为输入用于ADC采样:
把set_tris_a(0x00);修改为set_tris_a(0x01); - 修正adc0变量类型,适配10位ADC输出:
把全局变量定义int speed, state, adc0;修改为int speed, state; unsigned int16 adc0; - 修正速度映射的阈值范围,覆盖10位ADC全量程:
将f_speed()函数中的分段判断替换为如下代码:
void f_speed(void) { SET_ADC_CHANNEL(0); delay_us(100); adc0 = READ_ADC(); if(adc0<1) adc0=1; if(adc0>0 && adc0<=128) t2=2800; //280ms if(adc0>128 && adc0<=256) t2=2450; //245ms if(adc0>256 && adc0<=384) t2=2100; //210ms if(adc0>384 && adc0<=512) t2=1750; if(adc0>512 && adc0<=640) t2=1400; if(adc0>640 && adc0<=768) t2=1050; if(adc0>768 && adc0<=896) t2=700; if(adc0>896 && adc0<=1024) t2=350; //35ms }
如果需要更平滑的调速效果,也可以直接用线性映射替代多分支判断: t2 = 2800 - (adc0 * 2450 / 1023);
内容的提问来源于stack exchange,提问作者StillGrowingUp
相关产品推荐
相关产品推荐

