打印
[DemoCode下载]

PWM触发ADC检测

[复制链接]
1098|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
捉虫天师|  楼主 | 2019-4-27 22:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* 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);

}




使用特权

评论回复
沙发
捉虫天师|  楼主 | 2019-4-27 22:40 | 只看该作者
PWM功能强大,可以利用PWM触发ADC

使用特权

评论回复
板凳
捉虫天师|  楼主 | 2019-4-27 22:42 | 只看该作者
这也是一种定时触发ADC的方法,同时满足某个特别的情况。

使用特权

评论回复
地板
heisexingqisi| | 2019-4-28 00:01 | 只看该作者
原来如此,还以为中断内实现呢原来直接触发。

使用特权

评论回复
5
tianxj01| | 2019-4-28 10:29 | 只看该作者
捉虫天师 发表于 2019-4-27 22:40
PWM功能强大,可以利用PWM触发ADC

PWM触发,配合触发延时计数器,物理意义非常明确,就是避开PWM边沿时间,而PWM边沿时间,在功率系统,绝对是最大的脉冲干扰源,没有之一只是唯一,这样一来,就可以通过该触发+延时有效的消除该最大干扰源。

使用特权

评论回复
6
wanduzi| | 2019-4-29 11:49 | 只看该作者
楼上高手啊,MARK。

使用特权

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

本版积分规则

193

主题

3057

帖子

7

粉丝