Stellaris LM3Sxxx------ADC与数字比较器

很久没更了,今晚继续。

今天总结的是基于Cotex-M3内核的LM3S5R31芯片的一个很有用的外设--ADC,当然M3内核的ADC模块编程
基本都差不多,区别很小,不过数量上可能还是有区别的。学过数模电的人应该知道,ADC就是数模转换,特
别是对很多传感器,将数据读入到单片机。例如LM35、MPU6050、角度传感器。。。。

对于大对数人来说,ADC是一个很常用的模块,因此比较熟悉,这里重点说ADC的另一个功能--数字比较器

数字比较器

ADC 通常用于对外部信号采样并监控其数值的变动,确保其保持在给定的范围内。为了实现此监控过程的自
动化、减少所需的处理器开销,ADC 模块内置有 每个模块提供 8 个数字比较器。ADC 转换结果可直接发送
给数字比较器,与用户编程的门限进行比较。门限通过 ADC数字比较器范围寄存器(ADCDCCMPn)配置。
假如被监控的信号超出了容许的范围,则产生一个处理器中断及/或向PWM模块发送一个触发事件。 用户可将
数字比较器的4种工作模式(单次触发,持续触发,迟滞单次触发,迟滞持续触发)应用于3个相互独立的区
域(低值带、中值带、高值带)中。

简单地说就是将ADC转化结果发送给比较器,然后与比较器的设定值相比较,决定是否触发中断,这项功能
对检测外部电压变化有很好的作用,而且占用CPU资源很少。

ADC结构图


从结构图可以看出,数字比较器直接中断信号送到中断控制寄存器里,而需不要采样序列发生器的参与,然后中
断控制器产生序列中断(SSn),当然,为了降低错误的ADC触发中断,还可以先硬件平均之后,在与比较器比较。

输出功能

取决于 ADC 采样序列工作寄存器 n(ADCCSOPn)中SnDCOP位的设置,ADC 转换结果可以保存到 ADC 采样
序列FIFO中,也可以供给数字比较器进行比较。选定的 AD C转换结果将被其对应的数字比较器用于监控外部信
号。每个数字比较器可以有两种输出功能:处理器中断或 PWM 触发事件。

每种输出功能都有其状态机对被监控的信号实施追踪。中断功能和触发事件功能既可以分别启用,也可以同时启
用;两种功能将根据同一转换数据判断其条件是否已经满足、并据此产生相应的输出。

ADC信号


LM3S5R31芯片有16个ADC独立通道,资源十分丰富,能满足大多数要求。

工作模式

持续触发模式

在持续触发工作模式中,只要 ADC 转换值满足比较条件即会产生相应的中断或触发事件。因此,如果 A/D 转换
结果处于规定的范围内,将产生一连串的中断或触发事件。

单次触发模式

在单次触发工作模式中,只有当前 ADC 转换值满足比较条件并且前一个 ADC 转换值不满足比较条件时,才会
产生相应的中断或触发事件。因此,如果 A/D 转换结果处于规定的范围内,将产生单个中断或触发事件。

迟滞持续触发模式

迟滞持续触发工作模式只能结合低低值带或高值带工作,只有跨越中值带进入相反的区域时才会清除迟滞条件。
在迟滞持续触发工作模式中,满足以下条件时才会产生相应的中断或触发事件:ADC转换值满足其比较条件,
或之前的某个 ADC 结果满足比较条件,并且迟滞条件尚未清除(ADC 转换值尚未落入相反的区域)。因此,在
ADC 转换值进入相反的区域之前,将不断产生一连串的中断或触发事件。

迟滞单次触发模式

迟滞单次触发工作模式只能结合低低值带或高值带工作,只有跨越中值带进入相反的区域时才会清除迟滞条件。
在迟滞单次触发工作模式中,满足以下条件时才会产生相应的中断或触发事件:ADC转换值满足其比较条件,
且前一个 ADC 转换值不满足比较条件,且迟滞条件已清除。因此将产生单个中断或触发事件。

下图为低值带中断发生图:


持模式续触发下,当ADC值小于COMP0时产生中断;单次触发模式下,当ADC值小于COMP0值且上一次值大
于COMP0时产生中断;迟滞持续触发与迟滞单次与前两种模式类似,有图有真相 ^_^

下图为中值带中断发生图:


下图为高值带中断发生图:


代码

void Init_Adc_Digital_Comparetor(void)
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
	SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS);		//  设置ADC采样速率
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
	GPIOPinTypeADC(GPIO_PORTD_BASE,GPIO_PIN_2 | GPIO_PIN_3);
	
	ADCSequenceDisable(ADC1_BASE, 2);		
	ADCSequenceConfigure(ADC1_BASE, 2, ADC_TRIGGER_ALWAYS, 0);// 连续采样	
	ADCSequenceStepConfigure(ADC1_BASE, 2, 0, ADC_CTL_CH12 | ADC_CTL_CMP0);
	ADCSequenceStepConfigure(ADC1_BASE, 2, 1, ADC_CTL_CH13 | ADC_CTL_END |ADC_CTL_CMP1);
	
	ADCComparatorConfigure(ADC1_BASE,0,ADC_COMP_INT_MID_ALWAYS | ADC_COMP_TRIG_NONE);//中值带一直触发,不触发PWM,比较器0
	ADCComparatorConfigure(ADC1_BASE,1,ADC_COMP_INT_MID_ALWAYS | ADC_COMP_TRIG_NONE);	
	ADCComparatorRegionSet(ADC1_BASE,0,680,1023); //值范围680 - 1023 (2V - 3V)
	ADCComparatorRegionSet(ADC1_BASE,1,680,1023); 		
	ADCComparatorReset(ADC1_BASE, 0, true, true); //比较器复位设置
	ADCComparatorReset(ADC1_BASE, 1, true, true);

//	ADCComparatorIntEnable(ADC1_BASE,2);       //开比较器中断	
	ADCSequenceEnable(ADC1_BASE, 2);             //开启采样		
}
OK  Finish !   ^_^

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值