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

[复制链接]
2198|20
 楼主| huangcunxiake 发表于 2017-4-24 15: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 \r\n",unVoltageValue);
  83.   Delayms(500);
  84.   }
  85. }


gejigeji521 发表于 2017-4-24 16:49 | 显示全部楼层
这个代码跟官方的兼容吗
稳稳の幸福 发表于 2017-4-24 17:26 | 显示全部楼层
看了好多外设的操作,都是难道外设配置上。
wahahaheihei 发表于 2017-4-24 22:20 | 显示全部楼层
(ADC_CLK_Source==0x00000004)
这个后面的数字上的好唐突。
捉虫天师 发表于 2017-4-24 22:41 | 显示全部楼层
不知道是不是这个系列的库函数编写的问题,看着总是怪怪的。
bingkaiok 发表于 2017-4-24 22:57 | 显示全部楼层
这个是高人优化的代码,自己加了宏定义,精简高效
zcllom 发表于 2017-7-11 12:28 | 显示全部楼层
代码不全,贴出来有个什么用?用了那么多宏,宏定义跑哪儿去了?
天灵灵地灵灵 发表于 2017-7-11 19:26 | 显示全部楼层
应该查查头文件包含了什么。
天灵灵地灵灵 发表于 2017-7-11 19:50 | 显示全部楼层
查了一下,头文件里通常是这些内容
  1. #ifndef __SMARTM_M4_H__
  2. #define __SMARTM_M4_H__

  3. /*
  4.   ----------------------------------------------------

  5.                        系统
  6.   
  7.   ----------------------------------------------------
  8. */
  9. #include "stdio.h"
  10. #include "string.h"
  11. #include "M451Series.h"
  12. #include "Common.h"
  13. #include "Typedef.h"


  14. /*
  15.   ----------------------------------------------------

  16.                        外设
  17.   
  18.   ----------------------------------------------------
  19. */
  20. #include "gpio.h"
  21. #include "acmp.h"

  22. /*
  23.   ----------------------------------------------------

  24.                        配置
  25.   
  26.   ----------------------------------------------------
  27. */

  28. #define PLL_CLOCK   12000000UL



  29. #endif


天灵灵地灵灵 发表于 2017-7-11 19:51 | 显示全部楼层
就是把所有的集中到了一个里面,这样结构上看着干净多了,还是官方的那些内容。
zhuotuzi 发表于 2017-7-12 19:58 | 显示全部楼层
新唐的51内核,提供的代码都有点自己的特点。
dianbeng007 发表于 2017-9-25 14:44 | 显示全部楼层
好代码,寄存器操作,简单高效,但是不易移植
 楼主| huangcunxiake 发表于 2017-9-30 20:17 | 显示全部楼层
是的,如果用库函数效果更好。
稳稳の幸福 发表于 2017-9-30 20:52 | 显示全部楼层
代码的简练好用,是其他家没法比的。
mintspring 发表于 2017-9-30 22:23 来自手机 | 显示全部楼层
adc有自己的时钟源,配置好就可以用了
wahahaheihei 发表于 2017-10-1 14:03 | 显示全部楼层
  unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
yiy 发表于 2017-10-1 19:40 | 显示全部楼层
代码很完整啊,就是几个头文件而已
734774645 发表于 2017-10-2 11:09 来自手机 | 显示全部楼层
我准备把这个封装成一个函数,这样方便实用
xinpian101 发表于 2017-10-2 22:50 来自手机 | 显示全部楼层
那个数字没有用宏表示,我觉得很难理解了
heisexingqisi 发表于 2017-10-3 09:58 | 显示全部楼层
感觉很多语句不是程序,应该是宏。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3792

帖子

11

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