ADc5200WaitForAutoCaliFinished.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace Uestc.Auto6.Dso.Hardware.Driver
  8. {
  9. internal class Adc5200WaitForAutoCaliFinished
  10. {
  11. //在每次Exec开始执行Clear,在执行过程中需要进行ADC校准的时候(目前已知的包括:1、端口改变、2、增益调整、3、相位调整)加入等待列表,最后执行校准等待。
  12. internal readonly static Adc5200WaitForAutoCaliFinished Default = new Adc5200WaitForAutoCaliFinished();
  13. private readonly List<FPGAAdcPair> fpgaAdcPairList = new List<FPGAAdcPair>();
  14. public void TryAdd(int in_FPGAIndex,int in_AdcIndex)
  15. {
  16. bool bAlreadyExist = false;
  17. foreach (var v in fpgaAdcPairList)
  18. {
  19. if ((v.FPGAIndex== in_FPGAIndex) && (v.AdcIndex == in_AdcIndex))
  20. {
  21. bAlreadyExist = true;
  22. break;
  23. }
  24. }
  25. if (bAlreadyExist)
  26. return;
  27. fpgaAdcPairList.Add(new() { FPGAIndex = in_FPGAIndex, AdcIndex = in_AdcIndex });
  28. }
  29. public void Init()
  30. {
  31. fpgaAdcPairList.Clear();
  32. }
  33. public bool bNeedWaitfor => fpgaAdcPairList.Count > 0;
  34. public void ExecWaitForFinished(bool bNeedSetCaliReg62, UInt32 FinishedSendCaliReg0x62Value)
  35. {
  36. if (fpgaAdcPairList.Count == 0)
  37. return;
  38. #region Step1:在之前,已经打开了各个ADC的自动校准(0x6c寄存器 生成上升沿)
  39. foreach (var v in fpgaAdcPairList)
  40. {
  41. //开始校准
  42. Hd.currProduct!.AcqBd!.Send5200CmdWithCS_OneFpga((AcqBdNo)v.FPGAIndex, v.AdcIndex, 0x006C, 0); //CAL_SOFT_TRIG=0
  43. Hd.currProduct!.AcqBd!.Send5200CmdWithCS_OneFpga((AcqBdNo)v.FPGAIndex, v.AdcIndex, 0x006C, 1); //CAL_SOFT_TRIG=0
  44. }
  45. #endregion
  46. #region Step2:通过读取0x6a 寄存器 检查各个ADC的自动校准是否完成。集中检查全部的。此检查与系统安装的采集卡的个数和位置有关,与通道没有任何关系
  47. bool bAllFinished = false;
  48. Stopwatch stopwatch = new Stopwatch();
  49. long waitMs = 2_000;
  50. if (HdIO.CurrDriver == null || !HdIO.CurrDriver.bOpen)
  51. waitMs = 1;
  52. stopwatch.Start();
  53. while (!bAllFinished && stopwatch.ElapsedMilliseconds < waitMs)
  54. {
  55. bAllFinished = true;
  56. foreach (var v in fpgaAdcPairList)
  57. {
  58. Hd.currProduct!.AcqBd!.WriteReg(AcqBdReg.W.Adc_CS, (AcqBdNo)v.FPGAIndex, (UInt32)(v.AdcIndex + 1));
  59. uint data = Hd.currProduct!.AcqBd!.ReadFromAD5200((AcqBdNo)v.FPGAIndex, v.AdcIndex, 0x6a);
  60. Hd.currProduct!.AcqBd!.WriteReg(AcqBdReg.W.Adc_CS, (AcqBdNo)v.FPGAIndex, 0);
  61. if ((data & 0x3) == 0)
  62. bAllFinished = false;
  63. }
  64. }
  65. stopwatch.Stop();
  66. #endregion
  67. #region Step3:完毕自动检查
  68. if (bNeedSetCaliReg62)
  69. {
  70. foreach (var v in fpgaAdcPairList)
  71. {
  72. Hd.currProduct!.AcqBd!.Send5200CmdWithCS_OneFpga((AcqBdNo)v.FPGAIndex, v.AdcIndex, 0x0062, FinishedSendCaliReg0x62Value);//校准配置
  73. }
  74. }
  75. //if (ReSendOffsetValue)
  76. //Hd.currProduct?.AcqBd?.ResendAdcOffsetValue();
  77. #endregion
  78. }
  79. }
  80. }