C8051F120 ADC使用心得,及ADC2多通道源码共享!

2020-01-30 13:48发布

本帖最后由 绿茶山人 于 2013-4-15 11:37 编辑

最近在用C8051F120, 在ADC2上卡了几天,今天终于鼓捣成功了,完整源码在帖子最后附件中。

最开始的代码,烧入运行后发现当ADC所接模拟电压超过0.5V后,ADC2的转换结果就是255,在0~0.5V之间对应的ADC转换结果是0~255,检测半天也没看出代码问题,最后逛阿莫,看到有人出现了和我同样的结果,只是他用的F120的ADC0,这是该帖子的链接http://www.amobbs.com/forum.php? ... page%3D1#pid6600723  在17楼他反应电压超过0.5V转换结果就是最大值,他的代码我没看出问题。
电压超过0.5V后,ADC2的转换结果就是255,在ADC2_Init()中有问题,但是不知道这和结果有什么联系

  1. void main(void)
  2. {
  3.        ............
  4.         Timer3_Init();                    
  5.         PORT_Init();                       
  6.         OSCILLATOR_Init();                 // Initialize oscillator
  7.         ADC2_Init();                       // Init ADC2
  8.         EA = 1;                             // Enable global interrupts
  9.         ............

  10. }

  11. static void ADC2_Init(void)
  12. {
  13.         SFRPAGE = ADC2_PAGE;
  14.         ADC2CN = 0x02;            
  15.                                                                                           
  16.         //这个地方有问题,应加上SFRPAGE = ADC2_PAGE;
  17.         //但是没加这句程序可以运行,只是输入超过0.5V后结果一直是255, 不知道具体原因。
  18.         REF0CN = 0x0A;                      // Enable on-chip AV+

  19.         AMX2SL = 0x00;                      //从第0通道开始,一共8通道
  20.         ADC2CF = (SYSCLK / SAR_CLK - 1) << 3;    // ADC conversion clock
  21.         ADC2CF |= 0x01;                              // PGA gain = 1
  22.         EIE2   |= 0x10;                       // enable ADC2 interrupts
  23.         ADC2CN |= 0x80;                      // ADC2 enabled
  24. }
复制代码现在对ADC2_Init();进行修改,其他代码不变,运行后发现ADC2根本不转换,趴窝了!还是没找到原因,这是现在的ADC2_Iint():
  1. static void ADC2_Init(void)
  2. {
  3.         SFRPAGE   = ADC0_PAGE;
  4.         REF0CN = 0x0A;                      // Enable on-chip AV+
  5.         SFRPAGE = ADC2_PAGE;
  6.         AMX2SL = 0x0;                      //从第0通道开始,一共8通道
  7.         ADC2CF = (SYSCLK / SAR_CLK - 1) << 3;    // ADC conversion clock
  8.         ADC2CF |= 0x01;                              // PGA gain = 1
  9.         ADC2CN = 0x82;                                                               
  10.         EIE2   |= 0x10;                       // enable ADC2 interrupts
  11. }
复制代码用Configuration Wizard重新生成代码后发现和以前的很多初始化函数和一些寄存器的调用前后顺序很多都变化了,现在ADC2能正常运行,在输入电压是AV+时转换结果才是255。第一次的结果不知道是什么原因,第二次和第三次的差别就是改变个别初始化函数和寄存器的顺序,第二次趴窝,第三次正常,真是神奇的一款单片机!下面是修改的代码:

  1. static void Voltage_Reference_Init(void);

  2. void main(void)
  3. {
  4.        ................
  5.        //初始化顺序变了
  6.         PORT_Init();                       // Initialize crossbar and GPIO
  7.         Timer3_Init();                     // Initialize Timer2 to overflow at 1 mS
  8.         ADC2_Init();                       // Init ADC
  9.         Voltage_Reference_Init();                         //ADC2基准电压初始化
  10.         OSCILLATOR_Init();                 // Initialize oscillator
  11.        
  12.         EA = 1;                             // Enable global interrupts
  13.         EIE2 |= 0x10;   //开ADC2中断
  14.         ...............
  15. }
  16. static void ADC2_Init(void)
  17. {
  18.         SFRPAGE = ADC2_PAGE;       
  19.         AMX2SL  = 0x0;                      //从第0通道开始,一共8通道
  20.         ADC2CF  = (SYSCLK / SAR_CLK - 1) << 3;    // ADC conversion clock
  21.         ADC2CF |= 0x01;                                            // PGA gain = 1       
  22.         ADC2CN = 0x82;                                                                       
  23. }
  24. //=========================================================================================================
  25. //新添加的ADC2基准电压初始化
  26. //=========================================================================================================
  27. static void Voltage_Reference_Init(void)
  28. {
  29.     SFRPAGE   = ADC0_PAGE;
  30.     REF0CN = 0x0A;                      // Enable on-chip AV+
  31. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。