[DemoCode下载] 新唐M051 ADC模数转换程序

[复制链接]
1262|6
 楼主| 734774645 发表于 2016-2-14 18:59 | 显示全部楼层 |阅读模式
  1. /******************************************************************
  2. *注   意:硬件上的AVDD一定要接上基准电压
  3. ******************************************************************/
  4. #include "SmartM_M0.h"
  5. #define DEBUGMSG              printf
  6. #define ADC_CLOCK_DIVIDER     0x00040000
  7. #define ADC_CLK_Source        0x00000000
  8. #define AREF_VOLTAGE          4480
  9.       
  10. STATIC VOID AdcInit(VOID)
  11. {
  12. if(ADC_CLK_Source==0x00000004)
  13.     {
  14.         PLLCON |= PLL_SEL;
  15.         PLL_Enable();
  16.         /* 等待PLL稳定 */
  17.   while((CLKSTATUS & PLL_STB) == 0);  
  18. }
  19.     /* 复位ADC */   
  20.     set_ADC_RST;
  21.     clr_ADC_RST;
  22. /* ADC时钟使能 */      
  23.     set_ADEN_CLK;
  24.     if (ADC_CLK_Source==0x00000000 )
  25.     {
  26.         ADCClkSource_ex12MHZ;
  27.     }
  28.     else if(ADC_CLK_Source==0x00000004 )
  29.     {
  30.         ADCClkSource_PLL;
  31.     }
  32.     else if(ADC_CLK_Source==0x00000008 )
  33.     {
  34.         ADCClkSource_int22MHZ;
  35.     }
  36.     /* 设置ADC分频器 */
  37.     CLKDIV=ADC_CLOCK_DIVIDER;  
  38.   
  39.     /* ADC使能 */
  40.     set_ADEN;
  41.     set_CALEN;   
  42. while(!(ADCALR&CALDONE));
  43.     /* 单次转换模式 */
  44.     setAD_SIG;              
  45.     clr_DIFFEN;
  46. /* 设置ADC通道 */
  47.     set_CHEN0;
  48.     /* 使能P1.0为模拟输入引脚 */
  49.     set_ADC0_channel;
  50. /* 禁止P1.0数字输入通道 */
  51. P1_OFFD |= OFFD0;
  52.     /* 设置P1.0引脚为输入模式Configure P1.0 as input mode */
  53.     P10_InputOnly;
  54.     /* 清除ADC中断标志位 */
  55.     set_ADF;      
  56. }
  57. /****************************************
  58. *函数名称:main
  59. *输    入:无
  60. *输    出:无
  61. *功    能:函数主体
  62. ******************************************/
  63. INT32 main(VOID)
  64. {
  65.      UINT32 unVoltageValue;
  66.                            
  67.   PROTECT_REG          //ISP下载时保护FLASH存储器
  68.   (
  69.    PWRCON |= XTL12M_EN;       //默认时钟源为外部晶振
  70.    while((CLKSTATUS & XTL12M_STB) == 0);    //等待12MHz时钟稳定
  71.   
  72.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//设置外部晶振为系统时钟  
  73.   )
  74.   UartInit(12000000,9600);       //波特率设置为9600bps
  75.   AdcInit();
  76.   while(1)
  77.   {
  78.      set_ADST;            //启动ADC
  79.   while(ADSR&ADF==0);        //等待ADC结束
  80.   set_ADF;          //清空ADC结束标志位
  81.   unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
  82.   DEBUGMSG("Voltage %d mv ",unVoltageValue);
  83.   Delayms(500);
  84.   }
  85. }


gejigeji521 发表于 2016-2-15 14:38 | 显示全部楼层
DEBUGMSG("Voltage %d mv ",unVoltageValue);
这个函数如何用
 楼主| 734774645 发表于 2016-2-15 18:09 | 显示全部楼层


在BSP中,我们一般会用3个函数来实现打印:DEBUGMSG,RETAILMSG,NKDbgPrintfW。简单介绍一下:


NKDbgPrintfW(..)函数一般只在OAL中使用,可以直接从串口中打印出信息,不受编译选项的影响。


DEBUGMSG(..)函数只有在工程在Debug模式下编译以后,才会打印出信息来。如果是在Release模式下编译的,就不会打印信息出来。


RETAILMSG(..)函数在Debug模式下和Release模式下编译都会打印出调试信息,但是如果你在工程的属性中的"Build option"中选择了"Enable ship build",那么RETAILMSG函数就不会打印信息了。

dongnanxibei 发表于 2016-2-15 19:26 | 显示全部楼层
选用不同的ADC时钟的时候有不同的功耗还是怎么样?
ccw1986 发表于 2016-2-15 19:50 | 显示全部楼层
m051的adc也是12位的吧,采样率最高能达到多少呢
ccw1986 发表于 2016-2-16 20:58 | 显示全部楼层
DEBUGMSG函数有什么用啊,和printf一样吗
 楼主| 734774645 发表于 2016-2-18 11:16 | 显示全部楼层
ccw1986 发表于 2016-2-16 20:58
DEBUGMSG函数有什么用啊,和printf一样吗

看效果是一样的,不知道实现是不是一样,根据表现是名字不同,内容是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

3588

帖子

15

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