打印
[技术问答]

N76E003的ADC,为什么会工作不正常?

[复制链接]
1918|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dontium|  楼主 | 2018-12-3 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
N76E003的ADC,用PWM触发,ADC结果存入数组,并在主程序里累积。
数组大小为16,并设一指针。当指针归0时,在主程序里累积,并平均,现在这个累积,是100次转换的结果。
根据指针对16X6次的结果相加,再加4次ADC结果。
---------当执行这样的累加程序后(第一次),ADCCON0就变为0x42,处于忙状态,一直不再变空闲。

但是,又一个程序段累加了16个数据,没有使用数组指针,可以连续工作,ADCCON0为0x02,
沙发
598330983| | 2018-12-3 23:40 | 只看该作者
不知道,你是测几路的?
如果一路的,PWM触发后直接累加到SUM里,然后计数次数到100了,就求个平均值。这样不就行了,看你还搞数组还搞指针的,是不是弄太多导致变量超过256字节了?

使用特权

评论回复
板凳
598330983| | 2018-12-3 23:44 | 只看该作者
看你描述的很复杂,用简单的方法实现这个平均值试试。

使用特权

评论回复
地板
dongnanxibei| | 2018-12-4 22:42 | 只看该作者
之前我用过这个芯片,没发现什么问题,不过我的用法跟你的不同

使用特权

评论回复
5
734774645| | 2018-12-5 13:55 | 只看该作者
ADC是正常的,你可能使用数据的方式错了。

使用特权

评论回复
6
huangcunxiake| | 2018-12-7 10:32 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 ADC demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
//#define Enable_ADC_AIN0                        ADCCON0&=0xF0;P17_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT0;ADCCON1|=SET_BIT0                                                                        //P17
//#define Enable_ADC_AIN1                        ADCCON0&=0xF0;ADCCON0|=0x01;P30_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT1;ADCCON1|=SET_BIT0                //P30
//#define Enable_ADC_AIN2                        ADCCON0&=0xF0;ADCCON0|=0x02;P07_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT2;ADCCON1|=SET_BIT0                //P07
//#define Enable_ADC_AIN3                        ADCCON0&=0xF0;ADCCON0|=0x03;P06_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT3;ADCCON1|=SET_BIT0                //P06
//#define Enable_ADC_AIN4                        ADCCON0&=0xF0;ADCCON0|=0x04;P05_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT4;ADCCON1|=SET_BIT0                //P05
//#define Enable_ADC_AIN5                        ADCCON0&=0xF0;ADCCON0|=0x05;P04_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT5;ADCCON1|=SET_BIT0                //P04
//#define Enable_ADC_AIN6                        ADCCON0&=0xF0;ADCCON0|=0x06;P03_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT6;ADCCON1|=SET_BIT0                //P03
//#define Enable_ADC_AIN7                        ADCCON0&=0xF0;ADCCON0|=0x07;P11_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT7;ADCCON1|=SET_BIT0                //P11
//#define Enable_ADC_BandGap        ADCCON0|=0x0F;ADCCON1|=SET_BIT0                                                                                                                                                                                                                                                                //Band-gap 1.22V

//#define PWM0_FALLINGEDGE_TRIG_ADC                ADCCON0&=~SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1&=~SET_BIT3;ADCCON1&=~SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM2_FALLINGEDGE_TRIG_ADC                ADCCON0&=~SET_BIT5;ADCCON0|=SET_BIT4;ADCCON1&=~SET_BIT3;ADCCON1&=~SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM4_FALLINGEDGE_TRIG_ADC                ADCCON0|=SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1&=~SET_BIT3;ADCCON1&=~SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM0_RISINGEDGE_TRIG_ADC                ADCCON0&=~SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1&=~SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM2_RISINGEDGE_TRIG_ADC                ADCCON0&=~SET_BIT5;ADCCON0|=SET_BIT4;ADCCON1&=~SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM4_RISINGEDGE_TRIG_ADC                ADCCON0|=SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1&=~SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM0_CENTRAL_TRIG_ADC                                ADCCON0&=~SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1|=SET_BIT3;ADCCON1&=~SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM2_CENTRAL_TRIG_ADC                                ADCCON0&=~SET_BIT5;ADCCON0|=SET_BIT4;ADCCON1|=SET_BIT3;ADCCON1&=~SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM4_CENTRAL_TRIG_ADC                                ADCCON0|=SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1|=SET_BIT3;ADCCON1&=~SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM0_END_TRIG_ADC                                                ADCCON0&=~SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1|=SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM2_END_TRIG_ADC                                                ADCCON0&=~SET_BIT5;ADCCON0|=SET_BIT4;ADCCON1|=SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1
//#define PWM4_END_TRIG_ADC                                                ADCCON0|=SET_BIT5;ADCCON0&=~SET_BIT4;ADCCON1|=SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1

//#define P04_FALLINGEDGE_TRIG_ADC                ADCCON0|=0x30;ADCCON1&=0xF3;ADCCON1|=SET_BIT1;ADCCON1&=~SET_BIT6
//#define P13_FALLINGEDGE_TRIG_ADC                ADCCON0|=0x30;ADCCON1&=0xF3;ADCCON1|=SET_BIT1;ADCCON1|=SET_BIT6
//#define P04_RISINGEDGE_TRIG_ADC                        ADCCON0|=0x30;ADCCON1&=~SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1;ADCCON1&=~SET_BIT6
//#define P13_RISINGEDGE_TRIG_ADC                        ADCCON0|=0x30;ADCCON1&=~SET_BIT3;ADCCON1|=SET_BIT2;ADCCON1|=SET_BIT1;ADCCON1|=SET_BIT6
#endif

/******************************************************************************
* FUNCTION_PURPOSE: ADC interrupt Service Routine
******************************************************************************/
void ADC_ISR (void) interrupt 11
{
    clr_ADCF;                               // Clear ADC interrupt flag
                printf ("\n Value = 0x%bx",ADCRH);                // printf display will cause delay in ADC interrupt
                P30 ^= 1;                                                                                                                                // Check the P3.0 toggle at falling edge of PWM
}

/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{
    Set_All_GPIO_Quasi_Mode;
                InitialUART0_Timer1(9600);
       
/*-------------------------------------------------
        ADC trig initial setting
        Please modify #if value to open diffent type
--------------------------------------------------*/
#if 1
// By PWM falling edge
                PWM0_P12_OUTPUT_ENABLE;                               
                Enable_ADC_AIN0;                                                                                                                // Enable AIN0 P1.7 as ADC input
                PWM0_FALLINGEDGE_TRIG_ADC;       
#endif               
#if 0
// By PWM rising edge
                PWM0_P12_OUTPUT_ENABLE;                               
                Enable_ADC_AIN0;                                                                                                                // Enable AIN0 P1.7 as ADC input
                PWM0_RISINGEDGE_TRIG_ADC;
#endif               
#if 0
// By PWM central point
                PWM0_P12_OUTPUT_ENABLE;                               
                Enable_ADC_AIN0;                                                                                                                // Enable AIN0 P1.7 as ADC input
                PWM_CENTER_TYPE;
                PWM0_CENTRAL_TRIG_ADC;       
#endif       
#if 0
// By PWM end point
                PWM0_P12_OUTPUT_ENABLE;                               
                Enable_ADC_AIN0;                                                                                                                // Enable AIN0 P1.7 as ADC input
                PWM_CENTER_TYPE;
                PWM0_END_TRIG_ADC;
#endif       
       
// Setting PWM value
                PWMPH = 0x07;                                                                                                                                //Setting PWM value         
    PWMPL = 0xFF;
    PWM0H = 0x02;
    PWM0L = 0xFF;
          set_LOAD;                                                                                                                                                // PWM run
    set_PWMRUN;
// Setting ADC
          set_EADC;                                                                                                                                                // Enable ADC interrupt (if use interrupt)
                EA = 1;       
                while(1);

}




使用特权

评论回复
7
yiy| | 2018-12-8 23:04 | 只看该作者
没看明白16*6是啥。

使用特权

评论回复
8
dontium|  楼主 | 2018-12-10 00:16 | 只看该作者
598330983 发表于 2018-12-3 23:40
不知道,你是测几路的?
如果一路的,PWM触发后直接累加到SUM里,然后计数次数到100了,就求个平均值。这样 ...

为的是节省内存,节约时间

使用特权

评论回复
9
dontium|  楼主 | 2018-12-10 00:18 | 只看该作者
yiy 发表于 2018-12-8 23:04
没看明白16*6是啥。

100 = 16 x 6 + 4

使用特权

评论回复
10
dontium|  楼主 | 2018-12-10 00:19 | 只看该作者

使用特权

评论回复
11
xinxianshi| | 2018-12-10 09:56 | 只看该作者
如果采样频率远大于累加一次ADC结果的时间,完全可以每次转换后就立马进行一次累加。

使用特权

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

本版积分规则

个人签名:官向官来民向民,穷人向的是穷人

151

主题

1172

帖子

10

粉丝