c8051f060测量1k-10k脉冲幅度测不准

cristinay 2018-11-15 12:00:40
本人设计单片机c8051f060,用内部比较器 cp0+接输入脉冲信号,cp-接da信号设置门值,脉冲信号通过运放进入ad0和ad1进行测幅,当cp0+〉cp0-时,ad0busy=1;ad1busy=1;进ad中断,取出最大值。10个周期后,10个最大值取平均。为什么总是测不准。麻烦大神帮着妹妹看看,万分感谢!
...全文
51 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2018-12-22
  • 打赏
  • 举报
回复
你这个转换频率得高啊,中断响应必须快,不然就漏掉了
worldy 2018-11-16
  • 打赏
  • 举报
回复
引用 0 楼 u014625867 的回复:
本人设计单片机c8051f060,用内部比较器 cp0+接输入脉冲信号,cp-接da信号设置门值,脉冲信号通过运放进入ad0和ad1进行测幅,当cp0+〉cp0-时,ad0busy=1;ad1busy=1;进ad中断,取出最大值。10个周期后,10个最大值取平均。为什么总是测不准。麻烦大神帮着妹妹看看,万分感谢!


不明白说什么,电路图放出来
zgl7903 2018-11-15
  • 打赏
  • 举报
回复
AD输入先接电位器, 逐渐改变电压 看AD转换是否正确?
示波器测量到AD管脚上的脉冲信号,看信号是否符合芯片的电气规范
用一个管脚做输出指示(比较器中断中之一个管脚, AD采样结束后清除这个管脚), 双踪示波器示波器测量脉冲输入与这个管脚,看时序是否合适



cristinay 2018-11-15
  • 打赏
  • 举报
回复
<IMG src="file:///C:\Documents and Settings\Administrator\feiq\RichOle\1272055154.bmp">
cristinay 2018-11-15
  • 打赏
  • 举报
回复
void Port_IO_Init()
{

SFRPAGE = CONFIG_PAGE;
PAGE=SFRPAGE;
SFRPAGE=0x0F;
P0MDOUT = 0x35;
XBR0 = 0x87;
XBR2 = 0x44;
P1MDOUT = 0x05;
P1MDIN = 0x12;
P1 = 0x05;
P2MDOUT = 0x0f;
// P2 = 0x00;
P2MDIN = 0X0F;
P3MDOUT = 0x00;
P3 = 0x00;
P5MDOUT = 0xff;
P5 = 0x00;


P6MDOUT |= 0xff;
P6 |= 0x00;

P7MDOUT |= 0x00;
P7 |= 0x00;
SFRPAGE=PAGE;

}
void CP0_Init()
{
PAGE=SFRPAGE;
SFRPAGE=0x01;
CPT0CN=0x8f;
CPT0MD=0x30;
EIE1|=0x10;
EIP1|=0x10;
SFRPAGE=PAGE;
}

void CP0_Conver (void) interrupt 10
{
SFRPAGE=0x01;
if(CP0RIF)
{
iscomp0Rise=1;
iscomp0Fall=0;
CP0RIF=0;
SFRPAGE=0x01;
AD1BUSY=1;
}
if(CP0FIF)
{
iscomp0Rise=0;
iscomp0Fall=1;
SFRPAGE=0x01;
reult=tmp_max0;
AD1BUSY=0;

CP0FIF=0;
}
//AD1BUSY=1;
}
void ADC1_Init(void)
{
PAGE=SFRPAGE;
SFRPAGE=0x01;
// AMX1SL=0x00; //AIN0.0和 AIN0.1为独立的单端输入
ADC1CF = 0x00; //ADC转换时钟(SAR)=2MHz(24M时钟时),增益设为1
ADC1CN = 0x80; //ADC0使能,除了转换期间之外一直处于跟踪方式,当向AD0BUSY写1时ADC0转换开始
//ADC0H:ADC0L寄存器数据右对齐
REF1CN = 0x03; //ADC2电压基准取自AV+,内部偏压发生器工作(用ADC必须)
//ADC0电压基准取自VREF0引脚,电位器调为欧姆,使得基准电压为3V
// AD1BUSY=1;
EIE2|=0x02;
EIP2|=0x02;
SFRPAGE=PAGE;
}

//
////-----------------------------------------------------------------------------
//// ADC1_ISR
////-----------------------------------------------------------------------------
void ADC1_Conver (void) interrupt 15
{

if ((!AD1INT)||AD1BUSY) return;
AD1INT=0; //清除中断标志


input0= ((ADC1H*256+ADC1L)&0xffff);

if (tmp_max0 < input0)

tmp_max0 = input0;
}
main函数中
while(1)
{
SFRPAGE=0x00;
DAC0H=0x00;
DAC0L=0xfB;
if(iscomp0Fall==1)
{
iscomp0Fall=0;
maxvalue0+=tmp_max0;
tmp_max0=0;
pp0++;
if(pp0==10)
{
reult=maxvalue0/10;
maxvalue0=0;
pp0=0;
}
}
}
yishumei 2018-11-15
  • 打赏
  • 举报
回复
楼主查一下运放设计是不是有问题,运放前后的实际电压值和理论计算是不是一致。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧