[技术问答] 问个ML51ADC库函数问题

[复制链接]
736|6
 楼主| 幸福小强 发表于 2020-7-23 17:46 | 显示全部楼层 |阅读模式
  1.   
  2.   /**
  3.   * [url=home.php?mod=space&uid=247401]@brief[/url] This API configures ADC module to be ready for convert the input from selected channel
  4.   * @param[in] u8OpMode Decides the ADC operation mode. Valid values are:
  5.   *                       - \ref ADC_SINGLE               :Single mode.
  6.   *                       - \ref ADC_CONTINUOUS           :Continuous scan mode.
  7.   * @param[in] u8ChMask Channel enable bit. Each bit corresponds to a input channel. 0 is channel 0, 1 is channel 1..., 7 is channel 7.
  8.   *              VBG means band-gap voltage, VTEMP means temperature sensor, VLDO means LDO voltage.
  9.   * [url=home.php?mod=space&uid=266161]@return[/url]  None
  10.   * [url=home.php?mod=space&uid=536309]@NOTE[/url] ML51 series MCU ADC can only convert 1 channel at a time. If more than 1 channels are enabled, only channel
  11.   *       with smallest number will be convert.
  12.   * @exmaple :  ADC_Open(ADC_SINGLE,0);
  13.   */
  14. void ADC_Open(unsigned char u8ADCOpMode, unsigned char u8ADCChMask)
  15. {
  16.   set_ADCCON1_ADCEN;                              /* enable ADC circuit*/
  17.   switch (u8ADCOpMode)                            //ADC signle mode or continus mode select
  18.   {
  19.     case ADC_SINGLE:     SFRS=0x00;ADCCON1&=0xEF; break;
  20.     case ADC_CONTINUOUS: SFRS=0x00;ADCCON1|=0x10; break;
  21.     default: break;
  22.   }
  23.   
  24.   switch (u8ADCChMask)                            //ADC input channel digtial function disable
  25.   {
  26.     case 0: SFRS=0x00;ADCCON0&=0xF0;                                           AINDIDS=0xFE;MFP_P25_ADC_CH0;P25_INPUT_MODE; break;
  27.     case 1: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x01;SFRS=0x01;AINDIDS=0xFD;MFP_P24_ADC_CH1;P24_INPUT_MODE; break;
  28.     case 2: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x02;SFRS=0x01;AINDIDS=0xFB;MFP_P23_ADC_CH2;P23_INPUT_MODE; break;
  29.     case 3: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x03;SFRS=0x01;AINDIDS=0xF7;MFP_P22_ADC_CH3;P22_INPUT_MODE; break;
  30.     case 4: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x04;SFRS=0x01;AINDIDS=0xEF;MFP_P21_ADC_CH4;P21_INPUT_MODE; break;
  31.     case 5: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x05;SFRS=0x01;AINDIDS=0xDF;MFP_P20_ADC_CH5;P20_INPUT_MODE; break;
  32.     case 6: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x06;SFRS=0x01;AINDIDS=0xBF;MFP_P31_ADC_CH6;P31_INPUT_MODE; break;
  33.     case 7: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x07;SFRS=0x01;AINDIDS=0x7F;MFP_P32_ADC_CH7;P32_INPUT_MODE; break;
  34.     case VBG:   SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x08; break;
  35.     case VTEMP: SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x09; break;
  36.     case VLDO:  SFRS=0x00;ADCCON0&=0xF0;ADCCON0|=0x0A; break;
  37.   }
  38. }
这个是官方的库函数,我们看CASE0,跟其他的不同,那个我们可以理解成省略了ADCCON0|=0x00;
但是后面这个AINDIDS=0xFE;省略前面的SFRS=0x01;是不对的吧?因为前面有个SFRS=0x00
 楼主| 幸福小强 发表于 2020-7-23 17:47 | 显示全部楼层
大佬们看看手册啊,不知道我说的对不对,是不是库函数这里错了。
231605f195c9c4449e.png
手册这么说的,我觉得应该先切换到页1才行啊。
 楼主| 幸福小强 发表于 2020-7-23 17:49 | 显示全部楼层
#define    ADC_INPUT_CHANNEL0               SFRS=0;ADCCON0&=0xF0;ADCCON1|=SET_BIT0;SFRS=1;AINDIDS|=SET_BIT1
#define    ENABLE_ADC_AIN0                  SFRS=0;ADCCON0&=0xF0;ADCCON1|=SET_BIT0;SFRS=1;AINDIDS|=SET_BIT1
另外一个头文件也有这种类似的定义,如果没有弄错,那就矛盾了。
21mengnan 发表于 2020-7-23 20:34 | 显示全部楼层
幸福小强 发表于 2020-7-23 17:47
大佬们看看手册啊,不知道我说的对不对,是不是库函数这里错了。

手册这么说的,我觉得应该先切换到页1才 ...

这个是数字通道,意思是关闭模拟。。
21mengnan 发表于 2020-7-23 20:36 | 显示全部楼层
如果不设置默认全是IO口,不是AIN。为1则为AIN。
734774645 发表于 2020-7-23 22:42 | 显示全部楼层
看明白了说明用心了。
gejigeji521 发表于 2020-7-24 21:03 | 显示全部楼层
21mengnan 发表于 2020-7-23 20:36
如果不设置默认全是IO口,不是AIN。为1则为AIN。

大佬,他说的那个SFRS的在case0时候是不是也要有啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

1720

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部