⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 f2812内部ad转换程序
💻 C
字号:
#include "F281X.h"
#include "Macro.h"

extern cregister volatile Uint16 IFR;
extern cregister volatile Uint16 IER;

Uint16 ADC_data[200];
Uint16 ADC_num = 0;

void initsys(void);
void initadc(void);
interrupt void adc_int(void);

main()
{
	initsys();
	initadc();
	while(1);
}

void initsys(void)
{
	DINT;
    EALLOW;
    IER = 0x0000;
    IFR = 0x0000;
    PLLCR=0x0009;  // 135M 30M*9/2
	WDCR= 0x0068;  //Disable
    asm("  C28OBJ");
    
    PCLKCR = BIT3_16; //ADC clk enable
    
    SetBit0_16(PIECTRL);  //enable PIE vector
//	Clear all PIEIER registers:
    PIEIER1 = 0;
	PIEIER2 = 0;
	PIEIER3 = 0;	
	PIEIER4 = 0;
	PIEIER5 = 0;
	PIEIER6 = 0;
	PIEIER7 = 0;
	PIEIER8 = 0;
	PIEIER9 = 0;
	PIEIER10 = 0;
	PIEIER11 = 0;
	PIEIER12 = 0;
//	Clear all PIEIFR registers:
	PIEIFR1 = 0;
	PIEIFR2 = 0;
	PIEIFR3 = 0;	
	PIEIFR4 = 0;
	PIEIFR5 = 0;
	PIEIFR6 = 0;
	PIEIFR7 = 0;
	PIEIFR8 = 0;
	PIEIFR9 = 0;
	PIEIFR10 = 0;
	PIEIFR11 = 0;
	PIEIFR12 = 0;
	
	SetBit5_16(PIEIER1); //ADC INT
	SetBit0_16(IER);
    ADCINT_ISR=(unsigned long)&adc_int;
    
    EDIS;
    EINT;
}

void initadc(void)
{
	Uint16 i;
	DINT;
  
	EALLOW;
	SetBit3_16(PCLKCR);  //ADC的高速时钟使能
	HISPCP=0x0007;    //高速时钟预定标,sysclock/n*2,n!=0,n默认为1。n=7max
    
	SetBit14_16(ADCTRL1);  //ADC软件复位并延时.最小可一个NOP延时
//	for(i=0;i<0x10;i++);
	nop;
	ADCTRL1=0x08d0;   //0000|1000|1|1|01|0000,
                    //--|S/H wide|HISPCP/2|RUN=1连续转换|禁止绕回|级联

	SetBit14_16(ADCTRL2);
	ADCTRL2=0x0800;
//  ADCTRL2=0x2800; //0010:非级联;复位到0向量,此处不起作用;软件写1启动;rev
                  //1000:SQ1中断使能;中断方式,每个SQ1结束产生中断;rev;禁止EVA启动
                  //0000:禁止外部启动;复位SQ2;SQ2启动位;rev
                  //0000:同SQ1
	ADCTRL3=0x00de; //0000 0000 rev.11:带隙和基准加电; 00de
                  //0:核掉电;1111:clk/30;0:连续采样. 
                  //AD最终速度:135/(7*2)/2/(15*2)=160k
  
	for(i=0;i<60000;i++)  //min:7ms delay 
	{
		nop;
	}

	SetBit5_16(ADCTRL3); //延时后核加电.所有加电后,ADC 20us 后才进行第一次转换?

	for(i=0;i<60000;i++)  //min:7ms delay 
	{
		nop;
	}

	ADCMAXCONV=0x0000;   //最大转换通道数1,只转换一个通道
	ADCCHSELSEQ1=0x0000; //输入通道选择序列寄存器,此处选择ADCINA0 
	SetBit13_16(ADCTRL2);
	EDIS;
	EINT;
}

interrupt void adc_int(void)
{
	DINT;
	if(ADC_num < 200)
	{
		ADC_data[ADC_num]=ADCRESULT0>>4;  //结果寄存器12位左对齐
		ADC_num++;
		SetBit4_16(ADCST);       //清出ADC SQ1中断标志
		PIEACK = 0x0001;
	}
	else
		ADC_num = 0;
	EINT;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -