📄 ad.c
字号:
#include "ad.h"
//ad *adptr;
#define ADC_SIZE 16
#define MAX_DAC 4
unsigned int nNewConvert;
void AD_Init(void)
{
/* Set Calibration Register to 0 */
CALIBRATION = 0;
wait_us(2 );
ADCTRL1 = ADC_RESET;
wait_us(2 );
/* Enable AD CTL REGISTER1 */
// ADCTRL1 = ADC_SOFT | ACQ_PS_7 | ADC_SEQ_ACSC;
ADCTRL1 = ADC_SOFT | ACQ_PS_7 ;//| ADC_SEQ_ACSC;
/*----------------------------------------*/
/* Set Maximum Conversion to 15 at a time */
/*----------------------------------------*/
MAXCONV = 0;
/*---------------------------------------------*/
/* set the mux */
/*---------------------------------------------*/
CHSELSEQ1 = 0x0000;
CHSELSEQ2 = 0x0000;
CHSELSEQ3 = 0x1111;
CHSELSEQ4 = 0x1111;
nNewConvert = 0;
/* *(volatile unsigned int *)CHSELSEQ3 = 0xba98;
*(volatile unsigned int *)CHSELSEQ4 = 0xfedc; */
ADC_CONV_NUM_SET(15);
ADCTRL1_PARA_SET(ACQ_PS_0);
ADCTRL1_PARA_SET(ADC_SEQ_ACSC);
ADCTRL1_PARA_SET(CONT_RUN);
// ADCTRL1_PARA_SET(BRG_ENA);
// ADCTRL1_PARA_SET(STEST_ENA);
ADCTRL2_PARA_SET(RST_SEQ1);
ADCTRL2_PARA_SET(EVA_SOC_SEQ1);
ADCTRL2_PARA_SET(SOC_SEQ1);
}
//ADCTRL1参数设定,具体见上表
//使用方法:ADCTRL1_PARA_SET(ACQ_PS_x),ADC时钟的预定标系数
//ADCTRL1_PARA_SET(CPS),ADC转换逻辑时钟的预定标系数
//ADCTRL1_PARA_SET(CONT_RUN),设定排序器工作模式
//ADCTRL1_PARA_SET(SEQ_ACSC),设定级连排序器工作方式
//ADCTRL1_PARA_SET(ADC_RESET),ADC模块软件复位
//ADCTRL1_PARA_SET(CAL_ENA),ADC偏差校准使能位
//ADCTRL1_PARA_SET(BRG_ENA),ADC桥使能位
//ADCTRL1_PARA_SET(HI_LO),VREFHI作为ADC输入的值
//ADCTRL1_PARA_SET(STEST_ENA),使能自测试模式
void ADCTRL1_PARA_SET(unsigned int PARA)
{
ADCTRL1 |= PARA;
}
//ADCTRL1参数设定,具体见上表
//使用方法:ADCTRL1_PARA_SET(ACQ_PS_x),ADC时钟的预定标系数
//ADCTRL1_PARA_UNSET(CPS),ADC转换逻辑时钟的预定标系数为CLK/2;
//ADCTRL1_PARA_UNSET(CONT_RUN),设定排序器工作模式
//ADCTRL1_PARA_UNSET(SEQ_ACSC),设定级连排序器工作方式
//ADCTRL1_PARA_UNSET(ADC_RESET),ADC模块软件复位
//ADCTRL1_PARA_UNSET(CAL_ENA),ADC偏差校准使能位
//ADCTRL1_PARA_UNSET(BRG_ENA),ADC桥使能位
//ADCTRL1_PARA_UNSET(HI_LO),VREFHI作为ADC输入的值
//ADCTRL1_PARA_UNSET(STEST_ENA),使能自测试模式
void ADCTRL1_PARA_UNSET(unsigned int PARA)
{
unsigned int temp,temp2;
temp = ~PARA;
ADCTRL1 &= temp;
}
//ADCTRL2参数获取,
//使用方法:
//ADCTRL1_PARA_SET(CONT_RUN),测试是否为连续转换状态
//是,返回1,否则返回0
unsigned int ADCTRL1_PARA_GET(unsigned int PARA)
{
unsigned int temp;
temp = ADCTRL1;
temp = temp & PARA;
if (temp>0)
return 1;
else
return 0;
}
//ADCTRL2参数设定,
//使用方法:ADCTRL2_PARA_SET(EVB_SOC_SEQ),允许级连的排序器SEQ被EVB启动
//ADCTRL2_PARA_SET(RST_SEQ1),立即复位排序器
//ADCTRL2_PARA_SET(SOC_SEQ1),通过向这位写1来软件启动SEQ1转换
//ADCTRL2_PARA_SET(INT_ENA_SEQ1_X),SEQ1的中断方式使能控制位
//ADCTRL2_PARA_SET(EVA_SOC_SEQ1),允许SEQ1\SEQ被EVA的触发源启动
//ADCTRL2_PARA_SET(EXT_SOC_SEQ1),允许外部的ADCSOC引脚上的信号启动ADC自动转换
//ADCTRL2_PARA_SET(RST_SEQ2),复位排序器2
//ADCTRL2_PARA_SET(SOC_SEQ2),软件触发启动排序器2
//ADCTRL2_PARA_SET(INT_ENA_SEQ2_X),SEQ2的中断方式使能控制位
//ADCTRL2_PARA_SET(EVB_SOC_SEQ2),允许SEQ2被EVB的触发源启动
void ADCTRL2_PARA_SET(unsigned int PARA)
{
ADCTRL2 |= PARA;
}
//ADCTRL2参数设定,
//使用方法:ADCTRL2_PARA_SET(EVB_SOC_SEQ),允许级连的排序器SEQ被EVB启动
//ADCTRL2_PARA_SET(RST_SEQ1),立即复位排序器
//ADCTRL2_PARA_SET(SOC_SEQ1),通过向这位写1来软件启动SEQ1转换
//ADCTRL2_PARA_SET(INT_ENA_SEQ1_X),SEQ1的中断方式使能控制位
//ADCTRL2_PARA_SET(EVA_SOC_SEQ1),允许SEQ1\SEQ被EVA的触发源启动
//ADCTRL2_PARA_SET(EXT_SOC_SEQ1),允许外部的ADCSOC引脚上的信号启动ADC自动转换
//ADCTRL2_PARA_SET(RST_SEQ2),复位排序器2
//ADCTRL2_PARA_SET(SOC_SEQ2),软件触发启动排序器2
//ADCTRL2_PARA_SET(INT_ENA_SEQ2_X),SEQ2的中断方式使能控制位
//ADCTRL2_PARA_SET(EVB_SOC_SEQ2),允许SEQ2被EVB的触发源启动
void ADCTRL2_PARA_UNSET(unsigned int PARA)
{
unsigned int temp,temp2;
temp = ~PARA;
ADCTRL2 &= temp;
}
//ADCTRL2参数获取,
//使用方法:
//ADCTRL2_PARA_SET(SEQ1_BSY),测试SEQ1是否处于忙状态
//ADCTRL2_PARA_GET(INT_FLAG_SEQ1),测试SEQ!是否发生过中断事件
//ADCTRL2_PARA_SET(SEQ2_BSY),测试SEQ2是否处于忙状态
//ADCTRL2_PARA_GET(INT_FLAG_SEQ2),测试SEQ2是否发生过中断事件
//是,返回1,否则返回0
unsigned int ADCTRL2_PARA_GET(unsigned int PARA)
{
unsigned int temp;
temp = ADCTRL2;
temp = temp & PARA;
if (temp>0)
return 1;
else
return 0;
}
void ADC_CONV_NUM_SET(unsigned int CONV_NUM_VAL)
{
MAXCONV = CONV_NUM_VAL;
}
void ADC_CONV_RESULT_GET(unsigned int *p)
{
unsigned int i,temp;
volatile unsigned int *j;
temp = MAXCONV + 1;
j = Val_RESULT0;
for (i=0;i<temp;i++)
{
*p = *j>>6;
p++;
j++;
}
}
void READ_AD(unsigned int *p)
{
unsigned int TimeOutCtr = 0xffff;
if(ADCTRL1_PARA_GET(CONT_RUN))
{
ADC_CONV_RESULT_GET(p);
}
else
{
while(TimeOutCtr--)
{
/* Finished the Conversion */
if( ADCTRL2_PARA_GET(SEQ1_BSY)>0)
{
break;
}
}
if(TimeOutCtr>0)
{
ADC_CONV_RESULT_GET(p);
}
}
}
void AD_Test(void)
{
unsigned int res[16];
unsigned int i;
ADC_CONV_NUM_SET(15);
ADCTRL1_PARA_SET(ACQ_PS_0);
ADCTRL1_PARA_SET(ADC_SEQ_ACSC);
ADCTRL1_PARA_SET(CONT_RUN);
// ADCTRL1_PARA_SET(BRG_ENA);
// ADCTRL1_PARA_SET(STEST_ENA);
ADCTRL2_PARA_SET(RST_SEQ1);
ADCTRL2_PARA_SET(EVA_SOC_SEQ1);
ADCTRL2_PARA_SET(SOC_SEQ1);
wait_us(3);
// CHSELSEQ1=0x3210;
// CHSELSEQ2=0x7654;
// CHSELSEQ1=0xBA98;
// CHSELSEQ2=0xFEDC;
for(i=0;i<10;i++)
{
wait_second(5);
READ_AD(res);
}
//GPTx_Frequence_Set(GPT2,6);
//GPTxPINT_ENA(GPT2);
// GPTCONx_PARA_SET(EVA_NUM,T2TOADC_2);
//GPTx_ENA(GPT2);
}
void light_value(unsigned int *p,unsigned int maxconv_num)
{
unsigned int res[16];
unsigned int i,j,num,temp;
// CHSELSEQ1=0x3210;
// CHSELSEQ2=0x7654;
// CHSELSEQ1=0xBA98;
// CHSELSEQ2=0xFEDC;
READ_AD(res);
for(i=0;i<2;i++)
{
num=i*8;
temp = 0;
for(j=num;j<(num+8);j++)
{
temp= temp+res[j];
}
*p = temp/8;
p++;
}
//GPTx_Frequence_Set(GPT2,6);
//GPTxPINT_ENA(GPT2);
// GPTCONx_PARA_SET(EVA_NUM,T2TOADC_2);
//GPTx_ENA(GPT2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -