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

[复制链接]
3012|9
 楼主| Roderman_z 发表于 2015-9-18 22:17 | 显示全部楼层 |阅读模式
  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.     /* ADC使能 */
  39.     set_ADEN;
  40.     set_CALEN;   
  41. while(!(ADCALR&CALDONE));
  42.     /* 单次转换模式 */
  43.     setAD_SIG;            
  44.     clr_DIFFEN;
  45. /* 设置ADC通道 */
  46.     set_CHEN0;
  47.     /* 使能P1.0为模拟输入引脚 */
  48.     set_ADC0_channel;
  49. /* 禁止P1.0数字输入通道 */
  50. P1_OFFD |= OFFD0;
  51.     /* 设置P1.0引脚为输入模式Configure P1.0 as input mode */
  52.     P10_InputOnly;
  53.     /* 清除ADC中断标志位 */
  54.     set_ADF;      
  55. }
  56. /****************************************
  57. *函数名称:main
  58. *输    入:无
  59. *输    出:无
  60. *功    能:函数主体
  61. ******************************************/
  62. INT32 main(VOID)
  63. {
  64.      UINT32 unVoltageValue;
  65.                            
  66.   PROTECT_REG          //ISP下载时保护FLASH存储器
  67.   (
  68.    PWRCON |= XTL12M_EN;       //默认时钟源为外部晶振
  69.    while((CLKSTATUS & XTL12M_STB) == 0);    //等待12MHz时钟稳定
  70.   
  71.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//设置外部晶振为系统时钟
  72.   )
  73.   UartInit(12000000,9600);       //波特率设置为9600bps
  74.   AdcInit();
  75.   while(1)
  76.   {
  77.      set_ADST;            //启动ADC
  78.   while(ADSR&ADF==0);        //等待ADC结束
  79.   set_ADF;          //清空ADC结束标志位
  80.   unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
  81.   DEBUGMSG("Voltage %d mv \r\n",unVoltageValue);
  82.   Delayms(500);
  83.   }
  84. }


598330983 发表于 2015-9-20 16:42 | 显示全部楼层
  UartInit(12000000,9600);       //波特率设置为9600bps这个函数写的,如果添加上,奇偶验证,还有长度,验证码位数,就更爽了。
cowboy2014 发表于 2015-9-20 20:36 | 显示全部楼层
新唐的例程真是越来越多了
734774645 发表于 2015-9-28 13:29 来自手机 | 显示全部楼层
很喜欢新唐的结构,方便做程序
wahahaheihei 发表于 2015-9-28 22:20 来自手机 | 显示全部楼层
那个参考电压怎么胚子啊?
huangcunxiake 发表于 2015-9-28 22:48 来自手机 | 显示全部楼层
不知道这个头文件如何定义的,都有什么
abin_ 发表于 2015-10-28 11:59 | 显示全部楼层
#define AREF_VOLTAGE          4480
请问AD转换的值的换算公式中,这个AREF_VOLTAGE为什么是4480,是按什么定的。
unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
这个公式正确吗,我看例程都不一样,这里是&0xFFF,例程是&(0xFFFFUL<<0)
哪位大神帮忙解答下啊
abin_ 发表于 2015-10-28 12:01 | 显示全部楼层
另外ADC的时钟分频是起什么作用的啊,例程是设置为7,
看你这里是设置为4
#define ADC_CLOCK_DIVIDER     0x00040000
abin_ 发表于 2015-10-28 12:03 | 显示全部楼层
现在采样的是220V市电,ADDR0的值是00030FFF,之后不知道要怎么换算成电压值啊,怎么看都不对啊
zcllom 发表于 2017-7-11 12:40 | 显示全部楼层
宏定义又不给出,叫人怎么用啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

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