当前位置 : 主页 > 手机开发 > 其它 >

基于NUC442的EADC采样外部电压程序设计与实现

来源:互联网 收集:自由互联 发布时间:2021-06-19
一、NUC442介绍 NUC442 是一款带有 DSP 和浮点数单元的 Cortex ® -M4F 内核处理器,工作主频可达 84 MHz, 内嵌 256/512K/flash,64K/SRAM。片内具有丰富的外设资源,由于官方给的BSP包太混乱复杂,所

一、NUC442介绍

  NUC442 是一款带有 DSP 和浮点数单元的 Cortex ® -M4F 内核处理器,工作主频可达 84 MHz, 内嵌 256/512K/flash,64K/SRAM。片内具有丰富的外设资源,由于官方给的BSP包太混乱复杂,所以研究了一下EADC里的ADC 1。使用的NUC442JI8AE开发板,其PID是0x00044201。

二、关于EADC

  NUC442/NUC472系列包含一个12位,带16个外部输入通道和5个内部通道的逐次逼近法模 拟数字转换器 (SAR A/D 转换器) 。 A/D转换器可以通过软件触发、PWM 触发、timer0~3溢 出脉冲触发、ADINT0, ADINT1中断EOC(转换结束)脉冲触发和外部管脚 (STADC) 输入信 号触发转换。

三、模块代码实现

  此次引用了库函数,详细梳理了一下使用方法。

  (1)首先是ADC1的初始化函数,代码如下:

  

 1 void ADC1_Init(void)
 2 {
 3     unsigned char i=0;
 4     SYS_UnlockReg();
 5     CLK_EnableModuleClock(EADC_MODULE);  //使能EADC时钟
 6     CLK_SetModuleClock(EADC_MODULE, CLK_CLKSEL1_ADCSEL_PCLK, CLK_CLKDIV0_ADC(5));
 7     //PE8~PE15 ADC1->Channel 0~7
 8     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE8MFP_Msk)  | SYS_GPE_MFPH_PE8MFP_ADC1_0;
 9     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE9MFP_Msk)  | SYS_GPE_MFPH_PE9MFP_ADC1_1;
10     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE10MFP_Msk) | SYS_GPE_MFPH_PE10MFP_ADC1_2;
11     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE11MFP_Msk) | SYS_GPE_MFPH_PE11MFP_ADC1_3;
12     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE12MFP_Msk) | SYS_GPE_MFPH_PE12MFP_ADC1_4;
13     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE13MFP_Msk) | SYS_GPE_MFPH_PE13MFP_ADC1_5;
14     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE14MFP_Msk) | SYS_GPE_MFPH_PE14MFP_ADC1_6;
15     SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE15MFP_Msk) | SYS_GPE_MFPH_PE15MFP_ADC1_7;
16     PE->DINOFF = PE->DINOFF  | (GPIO_DINOFF_DINOFF8_Msk | GPIO_DINOFF_DINOFF9_Msk | GPIO_DINOFF_DINOFF10_Msk |
17                     GPIO_DINOFF_DINOFF11_Msk | GPIO_DINOFF_DINOFF12_Msk | GPIO_DINOFF_DINOFF13_Msk | 
18                     GPIO_DINOFF_DINOFF14_Msk | GPIO_DINOFF_DINOFF15_Msk); //关闭PE8~15数字输入通道
19         
20     SYS->VREFCTL = SYS_VREFCTL_VREF_AVDD; //设置参考电压为VDD
21     SYS_LockReg();
22 //----------------------------------------------------------------------------------    
23     /* Enable the A/D converter */
24     EADC_Open(EADC,0); //EADC使能;
25     /* Configure the EADC1 sample module 0~7 for analog input channel 0~7 and software trigger source.*/
26     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE0, EADC_SOFTWARE_TRIGGER, EADC1_CH0);
27     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE1, EADC_SOFTWARE_TRIGGER, EADC1_CH1);
28     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE2, EADC_SOFTWARE_TRIGGER, EADC1_CH2);
29     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE3, EADC_SOFTWARE_TRIGGER, EADC1_CH3);
30     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE4, EADC_SOFTWARE_TRIGGER, EADC1_CH4);
31     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE5, EADC_SOFTWARE_TRIGGER, EADC1_CH5);
32     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE6, EADC_SOFTWARE_TRIGGER, EADC1_CH6);
33     EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE7, EADC_SOFTWARE_TRIGGER, EADC1_CH7);
34     
35     EADC_CLR_INT_FLAG(EADC, 0x02); //ADINT1中断标志清0
36     EADC_ENABLE_INT(EADC, 0x02); //使能ADINT1
37     for(i=8;i<16;i++)  //AD1SPIE0:AD1SPIE7=[8:15]
38     {
39        EADC_ENABLE_SAMPLE_MODULE_INT(EADC, 1 , 1<<i); //ADC中断1源使能;ADC1-SAMPLE10~17中断使能;    
40     }
41     NVIC_EnableIRQ(EADC1_IRQn);
42 }

(2)然后接着就是中断服务函数,如下:

1 void EADC1_IRQHandler(void)  //EADC1中断服务函数
2 {
3     EADC1_ConversionFlag = 1;
4     EADC_CLR_INT_FLAG(EADC, 0x02);   //清除中断标志
5 }

(4)由于使用的是ADC1,所以还需要配置为EADC;

 1 void ADC_Select(ADC_Source source)
 2 {
 3     SYS_UnlockReg();
 4     if(source == ADC1_Select)  //选择EADC1
 5     {
 6         /* Set to EADC mode */
 7         SYS->VREFCTL = (SYS->VREFCTL & ~SYS_VREFCTL_ADCMODESEL_EADC) | SYS_VREFCTL_ADCMODESEL_EADC;
 8     }
 9     else                    //选择ADC0
10     {
11         SYS->VREFCTL = (SYS->VREFCTL & ~SYS_VREFCTL_ADCMODESEL_EADC) | SYS_VREFCTL_ADCMODESEL_ADC;
12     }
13     SYS_LockReg();
14 }

(5)最后就可以写自己的ADC处理函数啦;

1 unsigned int ADC1_Conversion_Process(ADC1_Channel ch)  //EADC1转换处理
2 {
3     unsigned int EADC1_Conversion_Result;
4     EADC_START_CONV(EADC,1<<(ch+8));   //开始转换模块10~17
5     while(!EADC1_ConversionFlag);        //等待转换完毕
6     EADC1_ConversionFlag = 0; 
7     EADC1_Conversion_Result=EADC1_GET_CONV_DATA(EADC,ch); //读取转换结果;
8     return EADC1_Conversion_Result;
9 }

(6)最后放上头文件吧;

  

 1 #ifndef _MY_EADC_H
 2 #define _MY_EADC_H
 3 #include "NUC472_442.h"
 4 //----------------------------------------------------------------------
 5 #define ADC1_VREF 3300
 6 #define ADC0_VREF 3300
 7 //----------------------------------------------------------------------
 8 typedef enum _ADC1_Channel{ADC1_CH0,ADC1_CH1,ADC1_CH2,ADC1_CH3,ADC1_CH4,ADC1_CH5,ADC1_CH6,ADC1_CH7}ADC1_Channel;
 9 typedef enum _ADC_Source{ADC0_Select,ADC1_Select}ADC_Source;
10 //----------------------------------------------------------------------
11 void ADC1_Init(void);
12 unsigned int ADC1_Conversion_Process(ADC1_Channel ch);
13 void ADC_Select(ADC_Source source);
14 //----------------------------------------------------------------------
15 extern unsigned char EADC1_ConversionFlag;
16 //----------------------------------------------------------------------
17 #endif

(7)本次使用的是软件触发转换,当然也可以使用其他触发方式;

(8)综上,NUC442的使用方法相对于STM32来说更为简单一点,功能也是比较强大的。

上一篇:暑假亡羊补牢 day3 封装1
下一篇:SSO介绍
网友评论