MSP430笔记5——ADC的使用

一、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;
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值