TMS320F28335入门(五)ADC学习

/*C28335片上有一个12位的A/D转换器、其前端为2个8选1多路切换器、2路同时采样保持器
**三者共同构成的16路模拟通道输入
**模拟量输入范围:0~3V
**模拟通道的切换由硬件控制,并将各个通道的转换顺序存入16个结果寄存器中
**其转换率:在25MHz的ADC时钟下为80ns;
**具有自动排序功能
**转换结果存储在16个结果寄存器中;转换结果 = 3 * (输入模拟信号-ADCLO)/4095;
**触发方式:软件启动、PWM模块、外部中断2引脚
**中断方式:可以在每次转换结束或者每隔一次转换结束触发中断


**两个采样保持器A、B分别对应着DSP引脚上INTA07、INTB07
**这两个采样保持器通过SEQ1、SEQ2两个状态排序寄存器进行管理;
**当ADC接收到触发源的转换请求(SOC),就通过排序器来进行自动完成多路转换;
**作用相当分配了所有通道的优先级,决定哪个通道先转换先存储。
**工作模式可以分成两种:级联工作、双排序工作模式;每种模式下还有顺序采样、同步采样两种采样方式;
**同步采样:两个采样保持器对应的输入引脚同时采样保持(但是必须有相同的偏移量,即ADCINXn中n相同,X = A,B)
**两种工作模式最大区别是:级联工作有效通道数最大为16、而双排序的有效通道数最大为8
**********/

//最大转换通道寄存器ADCMAXCONV,这个寄存器决定由多少个采样通道(该寄存器低四位有效)
//采样通道数 = (ADCMAXCONV~4)+1

//ADC输入通道选择排序控制寄存器ADCCHSELSEQn,n = 1 ~ 4;16位寄存器
//每4位决定一个输入通道,转换顺序是从ADCCHSELSEQ1的低四位–>ADCCHSELSEQ4的高四位

#define ADC_SHCLK 0x01
#define ADC_CKPS 0x00

#define BUF_SIZE 6
volatile Uint16 SampleTable[BUF_SIZE];
volatile float adc0 = 0;
volatile float adc1 = 0;
volatile float adc2 = 0;

void main(void) {

Uint16 i;
Uint16 array_index;

//初始化系统控制
InitSysCtrl();

// ADC模块输入时钟设置
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/2*ADC_MODCLK
EDIS;

//初始ADC工作
InitAdc();
//配置adc的时钟
//设置ADC采样时间
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;  
//ADC内核分频
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
//级联工作模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
//连续运行
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
//使能覆盖功能(完成排序后,排序器指针回到最初位置)
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;
//最大转换通道数
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x2;
//配置通道顺序-->设置CONV0为第一个通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
//允许向CPU发出中断请求
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x01;

// 清除采样结果寄存器
for (i=0; i<BUF_SIZE; i++)
{
 SampleTable[i] = 0;
}
// 启动ADC转换
AdcRegs.ADCTRL2.all = 0x2000;

while(1){
	if(array_index>BUF_SIZE)
		array_index = 0;

	//等待ADC的中断位为1
	while(AdcRegs.ADCST.bit.INT_SEQ1 == 0);

	//清除排序器中断位
	AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

	//将结果寄存器16位的值转换为10进制的数据
	SampleTable[array_index++] = ((AdcRegs.ADCRESULT0) >> 4);
	SampleTable[array_index++] = ((AdcRegs.ADCRESULT1) >> 4);
	SampleTable[array_index++] = ((AdcRegs.ADCRESULT2) >> 4);

	adc0 = (float)SampleTable[0] * 3.0/4096.0;
	adc1 = (float)SampleTable[1] * 3.0/4096.0;
	adc2 = (float)SampleTable[2] * 3.0/4096.0;

	DELAY_US(100);
	}

}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值