单片机/MCU论坛
直播中

李莉

8年用户 1510经验值
私信 关注
[问答]

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

本人设计单片机c8051f060,用内部比较器 cp0+接输入脉冲信号,cp-接da信号设置门值,脉冲信号通过运放进入ad0和ad1进行测幅,当cp0+〉cp0-时,ad0busy=1;ad1busy=1;进ad中断,取出最大值。10个周期后,10个最大值取平均。为什么总是测不准。麻烦大神帮着妹妹看看,万分感谢!

回帖(4)

李莉

2019-1-14 09:56:51
  1. void Port_IO_Init()
  2. {

  3.      SFRPAGE   = CONFIG_PAGE;
  4. PAGE=SFRPAGE;
  5. SFRPAGE=0x0F;
  6.      P0MDOUT   = 0x35;
  7.      XBR0      = 0x87;
  8.      XBR2      = 0x44;
  9. P1MDOUT   = 0x05;
  10. P1MDIN    = 0x12;
  11. P1        = 0x05;
  12. P2MDOUT   = 0x0f;      
  13. // P2        = 0x00;
  14. P2MDIN    = 0X0F;
  15. P3MDOUT   = 0x00;
  16. P3        = 0x00;
  17. P5MDOUT   = 0xff;
  18. P5    = 0x00;


  19. P6MDOUT  |= 0xff;         
  20.      P6       |= 0x00;                 

  21. P7MDOUT  |= 0x00;            
  22. P7       |= 0x00;
  23. SFRPAGE=PAGE;

  24. }
  25. void CP0_Init()
  26. {
  27. PAGE=SFRPAGE;
  28. SFRPAGE=0x01;
  29. CPT0CN=0x8f;
  30. CPT0MD=0x30;
  31. EIE1|=0x10;
  32. EIP1|=0x10;
  33.     SFRPAGE=PAGE;
  34. }

  35. void CP0_Conver (void) interrupt 10
  36. {
  37. SFRPAGE=0x01;
  38. if(CP0RIF)
  39. {
  40. iscomp0Rise=1;
  41. iscomp0Fall=0;
  42. CP0RIF=0;
  43. SFRPAGE=0x01;
  44. AD1BUSY=1;
  45. }
  46. if(CP0FIF)
  47. {
  48. iscomp0Rise=0;
  49. iscomp0Fall=1;
  50. SFRPAGE=0x01;
  51. reult=tmp_max0;
  52. AD1BUSY=0;

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

  72. //
  73. ////-----------------------------------------------------------------------------
  74. //// ADC1_ISR
  75. ////-----------------------------------------------------------------------------
  76. void ADC1_Conver (void) interrupt 15
  77. {
  78.      
  79. if ((!AD1INT)||AD1BUSY) return;
  80. AD1INT=0; //清除中断标志


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

  82.   if (tmp_max0 < input0)

  83.    tmp_max0 = input0;
  84. }
  85. main函数中
  86. while(1)
  87. {
  88. SFRPAGE=0x00;
  89.   DAC0H=0x00;
  90.   DAC0L=0xfB;
  91.   if(iscomp0Fall==1)
  92.   {
  93. iscomp0Fall=0;
  94. maxvalue0+=tmp_max0;
  95. tmp_max0=0;
  96. pp0++;
  97. if(pp0==10)
  98. {
  99. reult=maxvalue0/10;
  100. maxvalue0=0;
  101.   pp0=0;
  102.    }
  103. }
  104. }
举报

李鑫

2019-1-14 09:57:08
AD输入先接电位器, 逐渐改变电压 看AD转换是否正确?
示波器测量到AD管脚上的脉冲信号,看信号是否符合芯片的电气规范
用一个管脚做输出指示(比较器中断中之一个管脚, AD采样结束后清除这个管脚),  双踪示波器示波器测量脉冲输入与这个管脚,看时序是否合适
举报

陈丽

2019-1-14 09:57:17
楼主查一下运放设计是不是有问题,运放前后的实际电压值和理论计算是不是一致
举报

刘娟

2019-1-14 09:58:04
你这个转速率得高啊,中断响应必须快,否则就漏了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分