打印
[DemoCode下载]

新唐M051 ADC模数转换程序

[复制链接]
2691|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roderman_z|  楼主 | 2015-9-18 22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************************************
*注   意:硬件上的AVDD一定要接上基准电压
******************************************************************/
#include "SmartM_M0.h"
#define DEBUGMSG              printf
#define ADC_CLOCK_DIVIDER     0x00040000
#define ADC_CLK_Source        0x00000000
#define AREF_VOLTAGE          4480
     
STATIC VOID AdcInit(VOID)
{
if(ADC_CLK_Source==0x00000004)
    {
        PLLCON |= PLL_SEL;
        PLL_Enable();
        /* 等待PLL稳定 */
  while((CLKSTATUS & PLL_STB) == 0);
}
    /* 复位ADC */   
    set_ADC_RST;
    clr_ADC_RST;
/* ADC时钟使能 */      
    set_ADEN_CLK;
    if (ADC_CLK_Source==0x00000000 )
    {
        ADCClkSource_ex12MHZ;
    }
    else if(ADC_CLK_Source==0x00000004 )
    {
        ADCClkSource_PLL;
    }
    else if(ADC_CLK_Source==0x00000008 )
    {
        ADCClkSource_int22MHZ;
    }
    /* 设置ADC分频器 */
    CLKDIV=ADC_CLOCK_DIVIDER;

    /* ADC使能 */
    set_ADEN;
    set_CALEN;   
while(!(ADCALR&CALDONE));
    /* 单次转换模式 */
    setAD_SIG;            
    clr_DIFFEN;
/* 设置ADC通道 */
    set_CHEN0;
    /* 使能P1.0为模拟输入引脚 */
    set_ADC0_channel;
/* 禁止P1.0数字输入通道 */
P1_OFFD |= OFFD0;
    /* 设置P1.0引脚为输入模式Configure P1.0 as input mode */
    P10_InputOnly;
    /* 清除ADC中断标志位 */
    set_ADF;      
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
     UINT32 unVoltageValue;
                           
  PROTECT_REG          //ISP下载时保护FLASH存储器
  (
   PWRCON |= XTL12M_EN;       //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);    //等待12MHz时钟稳定
  
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//设置外部晶振为系统时钟
  )
  UartInit(12000000,9600);       //波特率设置为9600bps
  AdcInit();
  while(1)
  {
     set_ADST;            //启动ADC
  while(ADSR&ADF==0);        //等待ADC结束
  set_ADF;          //清空ADC结束标志位
  unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
  DEBUGMSG("Voltage %d mv \r\n",unVoltageValue);
  Delayms(500);
  }
}


沙发
598330983| | 2015-9-20 16:42 | 只看该作者
  UartInit(12000000,9600);       //波特率设置为9600bps这个函数写的,如果添加上,奇偶验证,还有长度,验证码位数,就更爽了。

使用特权

评论回复
板凳
cowboy2014| | 2015-9-20 20:36 | 只看该作者
新唐的例程真是越来越多了

使用特权

评论回复
地板
734774645| | 2015-9-28 13:29 | 只看该作者
很喜欢新唐的结构,方便做程序

使用特权

评论回复
5
wahahaheihei| | 2015-9-28 22:20 | 只看该作者
那个参考电压怎么胚子啊?

使用特权

评论回复
6
huangcunxiake| | 2015-9-28 22:48 | 只看该作者
不知道这个头文件如何定义的,都有什么

使用特权

评论回复
7
abin_| | 2015-10-28 11:59 | 只看该作者
#define AREF_VOLTAGE          4480
请问AD转换的值的换算公式中,这个AREF_VOLTAGE为什么是4480,是按什么定的。
unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
这个公式正确吗,我看例程都不一样,这里是&0xFFF,例程是&(0xFFFFUL<<0)
哪位大神帮忙解答下啊

使用特权

评论回复
8
abin_| | 2015-10-28 12:01 | 只看该作者
另外ADC的时钟分频是起什么作用的啊,例程是设置为7,
看你这里是设置为4
#define ADC_CLOCK_DIVIDER     0x00040000

使用特权

评论回复
9
abin_| | 2015-10-28 12:03 | 只看该作者
现在采样的是220V市电,ADDR0的值是00030FFF,之后不知道要怎么换算成电压值啊,怎么看都不对啊

使用特权

评论回复
10
zcllom| | 2017-7-11 12:40 | 只看该作者
宏定义又不给出,叫人怎么用啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

粉丝