📄 ad.c
字号:
//AD
#include "includes.h"
INT16U DataAD[8];
INT8U *pAdValue;
INT8U ADValue[3];
//INT32U Temp1;
/********************************************************************************/
void ACD_Func(void) {
INT8U LcdAD[] = {"Entering The ACD Operation Mode "};
LcdWriteAll(LcdAD);
InitADC0();
for(;;){
while (KeyFlag == ON) {
KeyFlag = OFF;
if (ValueKey == Enter){DataAD[0] = ReadADC0(0);}
else if (ValueKey == Exit) return; //if have exit key,go back
}
}
/*InitADC();
for(;;) {
LcdWriteAll(LcdAD); //display PWM menu
while (KeyFlag == ON) {
KeyFlag = OFF;
if (ValueKey == Enter){DisplayAdData();}
else if (ValueKey == Exit) return; //if have exit key,go back
}
}*/
}
/******************************************************************************/
/*void DisplayAdData() {
INT8U LcdADData[] = {"1, . v 2, . v 3, . v 4, . v 5, . v 6, . v 7, . v 8, . v "};
INT8U flag = ON;
INT8U *pAdValue;
INT8U i,j=2,k=2;
while (flag == ON){
LcdWriteAll(&LcdADData[k-2]);
ReadSequenceADC01(Channel0);
for(i=0;i<4;i++) {
pAdValue = ADVoltage((INT32U)DataAD[(k-2)/8+i]);
LcdADData[j] = (*pAdValue++ + 0x30);
LcdADData[j+2] = (*pAdValue++ + 0x30);
LcdADData[j+3] = (*pAdValue + 0x30);
j += 8;
}
while (KeyFlag == ON) {
KeyFlag = OFF;
if (ValueKey == Exit) {flag = OFF;}
else if (ValueKey == Up) {if(k>2) k -= 16;}
else if (ValueKey == Down) {if (k<34) k+= 16;}
}
j = k;
}
} */
/*****************************************************************************
将AD转换所得的数化成电压值,小数点后两位
*****************************************************************************/
INT8U *ADVoltage(INT32U ADData) {
INT32U Temp1;
Temp1 = (ADData*500/1024);
Temp1 = ADData;
ADValue[0] = (Temp1/100);
ADValue[1] = ((Temp1-ADValue[0]*100)/10);
ADValue[2] = (Temp1-ADValue[0]*100-ADValue[1]*10);
pAdValue = ADValue;
return (pAdValue);
}
/******************************************************************************
初始化AD模块:持续发送,多通道
*******************************************************************************/
/*void InitADC0(void)
{
ATD0CTL2 = (ATD0CTL2_ADPU_MASK+ ATD0CTL2_AFFC_MASK //+ ATD0CTL2_ASCIE
);
//ATD0CTL3 = 0x08; //决定转换序列中有多少个通道使用
ATD0CTL4 = 0x01;
} */
/*******************************************************************************/
/*void InitADC1(void) {
ATD1CTL2 = (ATD1CTL2_ADPU_MASK + ATD1CTL2_AFFC_MASK //+ ATD1CTL2_ASCIE
);
//ATD1CTL3 = 0x08; //决定转换序列中有多少个通道使用
ATD1CTL4 = 0x01;
} */
/********************************************************************************
持续发送,多通道,两个模块
*********************************************************************************/
/*void ReadSequenceADC01(INT8U channel){
INT8U i ;
ATD0CTL5 = (ATD0CTL5_DJM_MASK //向右对齐
+ ATD0CTL5_SCAN_MASK //连续模式
+ ATD0CTL5_MULT_MASK + channel); //多通道
ATD1CTL5 = (ATD1CTL5_DJM_MASK //向右对齐
+ ATD1CTL5_SCAN_MASK //连续模式
+ ATD1CTL5_MULT_MASK + channel); //多通道
for (i=0;i<8;i++) {
DataAD[i] = 0;
}
for (i=0;i<8;i++){
while(((ATD0STAT0 & ATD0STAT0_SCF_MASK)==0)||((ATD1STAT0 & ATD1STAT0_SCF_MASK)==0)){}; //判断一个序列是否全部转换完毕
DataAD[0] += ATD0DR0;
DataAD[1] += ATD0DR1;
DataAD[2] += ATD0DR2;
DataAD[3] += ATD0DR3;
DataAD[4] += ATD1DR0;
DataAD[5] += ATD1DR1;
DataAD[6] += ATD1DR2;
DataAD[7] += ATD1DR3;
}
for (i=0;i<8;i++) {
DataAD[i] = DataAD[i] / 8 ;
}
ATD0CTL5_SCAN = 0;
ATD1CTL5_SCAN = 0;
} */
/******************************************************************************
AD 转换模块
在芯片中有两套同样地8路10位AD模块,共16路
初始化 AD 转换模块0
PS:必须初始化,再取值否则将陷入死循环
******************************************************************************/
void InitADC0(void){
ATD0CTL2 = 0x80; // enable ADC
// bit 7 ADPU=1 设置功率提升
// bit 6 AFFC=0 ATD Fast Flag Clear All
// bit 5 AWAI=0 ATD Power Down in Wait Mode
// bit 4 ETRIGLE=0 External Trigger Level/Edge Control
// bit 3 ETRIGP=0 External Trigger Polarity
// bit 2 ETRIGE=0 External Trigger Mode Enable
// bit 1 ASCIE=0 ATD Sequence Complete Interrupt Enable
// bit 0 ASCIF=0 ATD Sequence Complete Interrupt Flag
ATD0CTL4 = 0x01; // configure conversion
// bit 7 SRES8=0 A/D Resolution Select
// 1 = 8 bit resolution(8位AD)
// 0 = 10 bit resolution(10位AD)
// bit 6 SMP1=0 Sample Time Select
// bit 5 SMP0=0 2 clock period
// bit 4 PRS4=0 ATD Clock Prescaler divide by 12
// bit 3 PRS3=0 ATD Clock Prescaler
// bit 2 PRS2=1 ATD Clock Prescaler
// bit 1 PRS1=0 ATD Clock Prescaler
// bit 0 PRS0=1 ATD Clock Prescaler
}
/******************************************************************************
初始化 AD 转换模块1, 基本同上
*****************************************************************************/
void InitADC1(void){
ATD1CTL2 = 0x80;
ATD1CTL4 = 0x01;
}
/******************************************************************************
读取某一通道AD数据
从第一套AD中读值,PAD0/AN0 ~ PAD7/AN7
输入:channel -> 通道0 <= channel <= 7
******************************************************************************/
INT16U ReadADC0(INT8U channel){
ATD0CTL5 = ATD0CTL5_DJM_MASK + //数据右对齐
(ATD0CTL5_Cx_MASK & channel); // 防止出错
// 等待CCF0 ,即转换完成, 经计算此转换要在使 while 循环31次
while((ATD0STAT1&0x01)==0){};
return ATD0DR0;
}
/*****************************************************************************
从第二套AD中读值,PAD8/AN8 ~ PAD15/AN15
输入:channel -> 通道0 <= channel <= 7
*****************************************************************************/
INT16U ReadADC1(INT8U channel){
ATD1CTL5 = ATD1CTL5_DJM_MASK +
(ATD1CTL5_Cx_MASK & channel);
while((ATD1STAT1&0x01)==0){};
return ATD1DR0;
}
/***************************************************************************
同时读取两套AD的数据
***************************************************************************/
/*void ReadADCDouble(INT8U channel1, INT8U channel2, INT16U * a, INT16U * b) {
channel2 -= 8;
ATD0CTL5 = ATD0CTL5_DJM_MASK +
(ATD0CTL5_Cx_MASK & channel1);
ATD1CTL5 = ATD1CTL5_DJM_MASK +
(ATD1CTL5_Cx_MASK & channel2);
while(!(ATD0STAT1_CCF0 || ATD1STAT1_CCF0)){};
*a = ATD0DR0;
*b = ATD1DR0;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -