打印
[M051]

M058SSAN实验ADC不成功时注意!!

[复制链接]
1699|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxjlm|  楼主 | 2015-3-23 11:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用研讨会发的板实验ADC转换,多次实验都不成功,串口助手显示0或者0xFF,没有中间值,很多参考书介绍参考电压接AVDD/55脚上,正确方法是:M058SSAN实验ADC时必须接参考电压到56脚Vref上,
实验很成功

相关帖子

沙发
lvyunhua| | 2015-3-23 12:45 | 只看该作者
:lol 恩,多谢分享!

使用特权

评论回复
板凳
songchenping| | 2015-3-23 12:57 | 只看该作者
那个板子啊。

使用特权

评论回复
地板
lvyunhua| | 2015-3-25 14:31 | 只看该作者
就是新唐的M0开发板,如下图所示:

nu58.PNG (94.76 KB )

nu58.PNG

使用特权

评论回复
5
springvirus| | 2015-7-25 18:38 | 只看该作者
是否为55脚的AVDD接参考电压,6脚的AVSS接参考电压地,另外56Vref也接同样的参考电压
偶的程序停在了_ADC_WAIT_COVERSION_DONE();
初始化也是按照例程来着,用的continuous mode,郁闷了

使用特权

评论回复
6
hxjlm|  楼主 | 2015-7-29 10:14 | 只看该作者
springvirus 发表于 2015-7-25 18:38
是否为55脚的AVDD接参考电压,6脚的AVSS接参考电压地,另外56Vref也接同样的参考电压
偶的程序停在了_ADC_W ...

/**************************************************************************//**
*实验名称:ADC实验
*描    述:通过对ADC,UART设置,实现ADC数据通过UART转USB在PC串口助手显示
*作    者:何新建
*实验日期:2015/3/12
*实验说明:串口通讯实验通过,每按一次复位键,串口助手收到一个ADC转换值,ADC实验通过
*硬件连接:UART/USB:PL2303,MUC:M058SSAN晶振12MHz,P1.0ADC输入,参考电压输入端56脚Vref接55脚AVDD,RXD/P3.0,TXD/P3.1程序下载Nu-Link-Me.
*代码说明:
*
******************************************************************************/
/* 本程序由 NuSmart 工具自动产生 */
#include <stdio.h>
#include "M051Series.h"
#include "initialization.h"

//#define _ADC_IS_CONVERSION_DONE()            ((ADC->ADSR & ADC_ADSR_ADF_Msk) >> ADC_ADSR_ADF_Pos)
/*-----------------------------------------------------------------*/
/* 初始化系统时钟                                                  */
/*-----------------------------------------------------------------*/
void SYS_Init(void)
{
    /* 解锁保护的寄存器 */
    SYS_UnlockReg();

    /* 使能 XTL12M */
    SYSCLK->PWRCON |= SYSCLK_PWRCON_XTL12M_EN_Msk;

    /* 等待时钟稳定 */
    SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_XTL12M_STB_Msk);

    /* 切换HCLK和SysTick的时钟源 */
    SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_XTAL;
    /* 切换IP模块的时钟源 */
    SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_UART_XTAL
                    | SYSCLK_CLKSEL1_ADC_HCLK;

    SYSCLK->CLKDIV = (0 << SYSCLK_CLKDIV_HCLK_N_Pos)
                   | (0 << SYSCLK_CLKDIV_UART_N_Pos)
                   | (0 << SYSCLK_CLKDIV_ADC_N_Pos);
    /* !!! SysTick被设定为来自"CPU", 当开始该时钟时,
       请在SysTick->CTRL中使用SysTick_CTRL_CLKSOURCE_Msk位。*/

    /* PLL掉电模式 */
    SYSCLK->PLLCON = 0x0005C22E;

    /* 现在可以安全的关闭没使用的时钟了! */
    SYSCLK->PWRCON &= ~(SYSCLK_PWRCON_OSC22M_EN_Msk
                      | SYSCLK_PWRCON_OSC10K_EN_Msk);

    /* 使能外围设备时钟 */
    SYSCLK->APBCLK = SYSCLK_APBCLK_UART0_EN_Msk
                   | SYSCLK_APBCLK_ADC_EN_Msk;

    /* 重置外围设备 */
    SYS->IPRSTC2 = SYS_IPRSTC2_UART0_RST_Msk
                 | SYS_IPRSTC2_ADC_RST_Msk
                 | SYS_IPRSTC2_GPIO_RST_Msk;
    SYS->IPRSTC2 = 0;                       

    /* 锁定保护的寄存器 */
    SYS_LockReg();
}

/*-----------------------------------------------------------------*/
/* 初始化IO引脚                                                    */
/*-----------------------------------------------------------------*/
void IO_Init(void)
{
    /* 设定引脚复用功能 */
    SYS->P1_MFP = SYS_MFP_P10_AIN0;
    SYS->P3_MFP = SYS_MFP_P30_RXD0
                | SYS_MFP_P31_TXD0;

    /* 配置引脚输入输出模式 */
    P1->PMD  = 0x0000FFFC;
    P1->DBEN = 0x00000001;
}

/*-----------------------------------------------------------------*/
/* 初始化UART0                                                     */
/*-----------------------------------------------------------------*/
void UART0_Init(void)
{
    /* UART0设定 */
    UART0->BAUD = UART_BAUD_MODE0 | UART_BAUD_DIV_MODE0(__XTAL, 19200);//115200不可用
    _UART_SET_DATA_FORMAT(UART0, UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1);
    UART0->FCR = UART_FCR_RTS_TRI_LEV_1BYTE
               | UART_FCR_RFITL_1BYTE
               | UART_FCR_RX_DIS_Msk;

}

/*-----------------------------------------------------------------*/
/* 初始化ADC                                                       */
/*-----------------------------------------------------------------*/
void ADC_Init()
{
    /* 设定ADC控制寄存器 */
    ADC->ADCR = ADC_ADCR_DMOF_UNSIGNED_OUTPUT    //选择二进制的格式作为转换结果的输出格
              | ADC_ADCR_DIFFEN_SINGLE_END       //单端输入模式
              | ADC_ADCR_TRGCOND_LOW_LEVEL       //STADC Low 活动的级别
              | ADC_ADCR_ADMD_SINGLE             //单模式
              | ADC_ADCR_ADEN_CONVERTER_ENABLE;  //ADC 转换器启用

    /* 使能模拟输入通道 */
    ADC->ADCHER = 0x01;

}

/*-----------------------------------------------------------------*/
/* 主程序                                                       */
/*-----------------------------------------------------------------*/
int32_t main(void)
{
  int32_t  i32ConversionData;
                SYS_Init();//调用系统时钟初始化函数
    IO_Init();//调用I/O口初始化函数
    UART0_Init();//串口初始化函数
    ADC_Init();//ADC初始化函数

    _ADC_START_CONVERT();                 // 启动 ADC 转换

        _ADC_WAIT_COVERSION_DONE();//等待转换完成
        i32ConversionData = _ADC_GET_CONVERSION_DATA(0);//获取0通道转换数据
        printf("ADC通道0 %d: 0x%X (%d V)\n", 0, i32ConversionData, i32ConversionData);//串口助手显示"ADC通道0 0x0 (0V)"
        
                                ADC->ADSR = ADC_ADSR_ADF_Msk;      /* 清除A/D转换结束标记 */

        ADC_ResetIP();//调用 ADC IP 重置
  _ADC_DISABLE_CLOCK();//调用 禁用 IP ADC 时钟函数
  NVIC_DisableIRQ(ADC_IRQn);

while(1);       
}

使用特权

评论回复
7
springvirus| | 2015-7-29 11:41 | 只看该作者
本帖最后由 springvirus 于 2015-7-29 12:46 编辑
hxjlm 发表于 2015-7-29 10:14
/**************************************************************************//**
*实验名称:ADC实验 ...

上面打开P1的ADC复用后,还有P1->PMD  = 0x0000FFFC; 设置管脚为输入方式
官方的例程void AdcContScanModeTest()在的工程里,并没有打开复用后,继而设置输入方式
看手册里,也没有具体说明复用后,再设置为输入
我程序目前没有设置为输入方式,等回来试试
(看到P30 P31串口复用打开后,并没有设置输入输出方式,难道是ADC特殊?)
另外,P1->DBEN的作用,能否具体说说,谢谢

使用特权

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

本版积分规则

14

主题

117

帖子

0

粉丝