8h1k08-36i ADC读取问题
本帖最后由 tailimo 于 2024-9-4 22:14 编辑我使用ADC10与13通道读取电位器的ad值 ,通过PWM输出给灯(PWM测试过是正常的),
供电与ADC_Vref为3.1v左右
一个通道输入为0v时,另外一个通道可以正常输出10位ad值
当其中一个通道输入电压值大于另外一个通道大约1v时, 输入电压值小的其ad值将变为0左右(指 存在一个1v左右压差)
子函数
void ADCInit(void)
{
ADC_CONTR = 0x00; //关闭adc
ADCCFG = 0xf0; //右对其
ADCTIM = 0x3d; //300K
}
unsigned int ADC10_Start(void)
{
ADC_CONTR = 0xca; //启动adc10通道
while(!(ADC_CONTR&0x20)); //判断是否完成
ADC10value=256*ADC_RES;
ADC10value+=ADC_RESL;
ADC_CONTR = 0x80; //清除标志
return ADC10value; //返回ADC值
}
unsigned int ADC13_Start(void)
{
ADC_CONTR = 0xcd; //启动adc13通道
while(!(ADC_CONTR&0x20)); //判断是否完成
ADC13value=256*ADC_RES;
ADC13value+=ADC_RESL;
ADC_CONTR = 0x80;
return ADC13value; //返回ADC值
}
void ADC_Open(void)
{
ADC_CONTR = 0x80; //开启adc
_nop_();
}
主程序main
P_SW2 = 0x80;
初始化......
unsigned int a=0,b=0;
ADC_Open();
while(1)
{
a = ADC10_Start();
b = ADC13_Start();
PWM_82_CCR_Value(a); //写入PWM8_2的CCR寄存器
PWM_4N_CCR_Value(b); //写入PWM4N的CCR寄存器
}
本帖最后由 DebugLab 于 2024-9-4 23:41 编辑
建议使用中断
初始化:
ADCCFG=ADC_RESFMT; //设置ADC转换结果右对齐,设置ADC时钟
ADC_CONTR=ADC_POWER; //使能ADC
ADC_CONTR|=5; //设置ADC通道为ADC5
ADC_CONTR|=ADC_START; //启动ADC
EADC=1; //使能ADC中断
中断:
void ADC_Isr(void) interrupt 5
{
ADC_CONTR&=~ADC_FLAG;
ADC_Value=ADC_RES;
ADC_Value<<=8;
ADC_Value|=ADC_RESL;
ADC_CONTR|=ADC_START;
}
DebugLab 发表于 2024-9-4 23:27
建议使用中断
初始化:
ADCCFG=ADC_RESFMT; //设置ADC转换结果右对齐,设置ADC时 ...
顺序换换
void ADC_Isr(void) interrupt 5
{
ADC_Value=ADC_RES;
ADC_Value<<=8;
ADC_Value|=ADC_RESL;
ADC_CONTR&=~ADC_FLAG;
ADC_CONTR|=ADC_START;
}
另外我没看手册是几位的adc,楼主左移了两位是10位adc的写法,你左移了8位是16位adc写法。 本帖最后由 tailimo 于 2024-9-5 16:38 编辑
解决了一半, 中断处理ad值,外部重复采样+延时 起码采样2次,前后延时10us 取采样第二个ad值就可以了, 根本问题还是没有解决,输入电压小的, 在通道与通道压差 大于或者小于1v时, 输入电压小的ad值还是会变小一点
页:
[1]