一、DTC的初始化设置
SREFx 设置基准电压
INCH 选择ADC输入通道
/*设置ADC,采集电压*/
void InitADC(void)
{
/*设置ADC时钟MCLK*/
ADC10CTL1 |= ADC10SSEL_2;
/*ADC 2分频*/
ADC10CTL1 |= ADC10DIV_0;
/*设置ADC基准源*/
ADC10CTL0 |= SREF_1;
/*设置ADC采样保持时间64CLK*/
ADC10CTL0 |= ADC10SHT_3;
/*设置ADC采样率200k*/
ADC10CTL0 &= ~ADC10SR;
/*ADC基准选择2.5V*/
ADC10CTL0 |= REF2_5V;
/*开启基准*/
ADC10CTL0 |= REFON;
/*选择ADC输入通道A0*/
ADC10CTL1 |= INCH_0;
/*允许A0模拟输入*/
ADC10AE0 |= 0x0001;
/*开启ADC*/
ADC10CTL0 |= ADC10ON;
}
/*ADC的转换(模拟->数字)*/
uint16_t GetADCValue(void)
{
/*开始转换*/
ADC10CTL0 |= ADC10SC|ENC; //两个使能端,后者每次会自动复位,需手动置入
/*等待转换完成*/
while(ADC10CTL1&ADC10BUSY); //标志有无采样过程
/*返回结果*/
return ADC10MEM; //保存10位转换结果到10MEM寄存器中
具体应用:
int main(void)
{
float voltage = 0;
uint16_t adcvalue = 0;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
InitSystemClock();
InitUART();
InitADC();
while(1)
{
adcvalue = GetADCValue(); //赋值采集到电压的数字量
voltage = adcvalue * 2.5 / 1023; //通过公式转换为相应电压值
UARTSendString("ADC10转换结果为:",17);
PrintNumber(adcvalue);
UARTSendString("相应电压值为:",14);
PrintFloat(voltage);
__delay_cycles(300000);
}
return 0;
}
二、ADC数据传输控制器DTC
自动保存到其他的内存位置中完成传输
使用方式:
三种传输模式
- 单块传输模式
ADC10DTC1 n次转换完成之后为一个block ADC10SA传输地址,由于ADC是10位寄存器,需要两个字节(16位)保存,故下一个地址为ADC10SA+2(内部地址指针)
每传输一次内部传输计数器减一,为0之后不可再传输;
ADC10IFG传输n次后标志位被置位(中断方式) - 双块传输模式
n次后,地址指针指向下一个传输位置,完成两次one block的转换 - 连续传输模式
循环放置
代码案例:
uint16_t adcbuff[50] = {0}; //定义一个长度为50的数组
void InitADC(void)
{
/*设置ADC时钟MCLK*/
ADC10CTL1 |= ADC10SSEL_2;
/*ADC 2分频*/
//ADC10CTL1 |= ADC10DIV_0;
/*设置ADC基准源*/
ADC10CTL0 |= SREF_1;
/*设置ADC采样保持时间16CLK*/
ADC10CTL0 |= ADC10SHT_2;
/*设置ADC采样率200k*/
ADC10CTL0 |= ADC10SR;
/*ADC基准选择2.5V*/
ADC10CTL0 |= REF2_5V;
/*开启基准*/
ADC10CTL0 |= REFON;
/*选择ADC输入通道A4*/
ADC10CTL1 |= INCH_4;
/*允许A4模拟输入*/
ADC10AE0 |= 1 << 4;
/*DTC传输模式*/
ADC10DTC0 |= ADC10CT; //传输模式为连续
/*传输次数*/
ADC10DTC1 = 50; //一个块为50次
/*起始地址*/
ADC10SA = (uint16_t)(adcbuff);
/*开启ADC*/
ADC10CTL0 |= ADC10ON;
/*允许转换*/
ADC10CTL0 |= ENC;
}
int main(void)
{
uint8_t cnt = 0;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
InitSystemClock();
InitUART();
InitADC();
for(cnt = 0;cnt < 50;cnt ++)
{
StartADCConvert();
}
for(cnt = 0;cnt < 50;cnt ++)
{
StartADCConvert();
}
__delay_cycles(1000000);
while(1)
{
__delay_cycles(1000000);
}
return 0;
}