本帖最后由 youki12345 于 2015-10-11 17:28 编辑
ADC一直是单片机的必备外设,R7F0C809 当然也不例外。相对于其他外设,ADC的功能是比较复杂的。但如果你有了其他单片机AD的基础的话,基本上瑞萨R7F的ADC也没有问题。
首先,R7F的ADC有几个?通常来说一个芯片里面ADC只有一个,但并不是说他只能外接一路ADC,ADC虽然只有一个,但是可以有多个通道。R7F单片机根据引脚数目的不同,有着多种选择。
这个图对ADC通道的情况说得非常清楚,如果你的芯片IO口比较少的话就只有6个通道,而如果IO口很多的话通道的数目也就非常多了,最多可以达到26个通道。这里特别要注意,对于io口数目较少的芯片来说6个通道并不是按照顺序来的,而是通道的名称发生了跳跃,我猜想这是为了保持不同系列之间的兼容性!
除了通道外,ADC最重要的另外一个问题就是它的精度,或者说它的位数。R7F Mcu ADC的位数是可变的,通过对寄存器位ADTYP的配置你既可以选择10位,也可以选择8位以满足不同场合应用的需求。
前面说到,ADC是相对复杂的一个功能,那么为什么说它复杂呢?主要的原因是ADC有不同的工作模式与配置模式,这就造成的工作方式的千差万别。
1. 触发模式
软件触发 :这种模式主要由软件上通过设置寄存器完成,例如我们要每个多少ms采集一次数据的话那就应该使用这种模式。
硬件触发非等待:这种模式是由外部的一个信号变化来进行触发的。当外部有个信号发生了变化后,MCU立即对ADC进行采样。
硬件触发等待:这种模式主要适合于休眠状态的MCU,当外部有个信号变化后,CPU从休眠状态醒来,待等待系统稳定后再进行AD采样。
2. 扫描模式
连续扫描模式:选定好几个通道,然后系统自动的扫描转换几个通道的AD值。
指定模式:这种模式下就是指定一个通道作为AD转换的通道
3. 转换模式
One-shot模式:对选定的一个通道进行一次触发转换
顺序转换模式:对选定的一系列通道进行连续顺序的转换。
4. 采样时钟模式
7周期模式
5周期模式
图3的寄存器是如果要使用AD的话要用到的要配置的寄存器。归纳起来就是配置IO,配置AD转换方式及通道,最后启动AD。
下面通过代码来对RF7 ADC的工作方式及配置方式进行详细的讲解:(整个工程见附件)
首先,进入主要的MAIN函数。在MAIN函数中对一些必备的变量,如:count,result_buffer进行初始化后进入一个关键函数R_ADC_Set_OperationOn(); 这个函数中只有一句话ADCE = 1U; /* enable AD comparator */
这句话的意思就是把ADCE位设置为1,即打开ADC的clock,允许ADC模块运行。后面的U是C语言的后缀写法,表示无符号数。
紧接着R_ADC_Set_OperationOn();的是一小段循环,这里主要是耗费时间,因为启动ADC是需要一定时间的,所以等待一会让它完全启动成功。
for (count=0U; count<3U;count++)
{
NOP();
}
随后,系统就进行了一个死循环,在该循环中首先调用R_ADC_Start();函数。这个函数中主要有以下三句话,也就是配置寄存器。
ADIF=0U; /* clear INTAD interrupt flag */
ADMK = 0U; /* enable INTAD interrupt */
ADCS = 1U; /* enable AD conversion */
ADIF 标记位为AD中断标记位,把这位设置为零显然是在清中断标记位。
ADMK标记位为AD中断屏蔽位,把其设置为零则表示的是允许AD中断
ADCS标记设置为1,表示开始AD转换。
由于已经打开并且允许了AD转换,因此在开始ADCS位后,芯片的AD系统开始自动采样量化,待AD转换完成就会触发一个中断。而此时主程序却由HALT指令进入了暂停模式,等到AD中断发生再把其唤醒,这时就可以直接调用R_ADC_Get_Result( &result_buffer );函数读取AD采样的值。
上面这些就是一个最基本的AD转换程序,它是采用默认的时钟频率对ADC通道0进行采样。其实还是比较简单的。如果要对不同的通道,或采用不同的方式的话,那还要配置不同的寄存器。但也是相当简单的。