本次所做实验为KL26Z的CPM功能,这个功能貌似被ADC里面的比较功能给覆盖了,但是ADC的比较功能只能是相应的两个AD通道,而CPM可以实现多通道进行比较,可以相互比较,也可以由自带的DAC产生基准电压与之比较,非常方便。
这次直接用到例程上的源程序,没有做更改,只是标注了一些地方。#include "includes.h"
void gpioInit(void) //配置需要点亮的LED的IO
{
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
PORTB_PCR18 |= (PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK);
FGPIOB_PSOR |= 1<<18;
FGPIOB_PDDR |= 1<<18;
}
void cmpInit(INT8U ucdacOut)
{
SIM_SCGC4 |= SIM_SCGC4_CMP_MASK; //使能时钟
SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;
/*
* CMP DAC配置
*/
CMP0_DACCR |= CMP_DACCR_DACEN_MASK | CMP_DACCR_VOSEL_MASK | CMP_DACCR_VOSEL(ucdacOut);
PORTC_PCR6 |= PORT_PCR_MUX(0); /* 这里并不是源程序所说的模拟输入,而是PTC6的默认配置(MUX(0))就是DMP0输入*/
/*
* 选择通道为CMP0和DA产生的通道7
*/
CMP0_MUXCR |= CMP_MUXCR_PSTM_MASK | CMP_MUXCR_MSEL(7) | CMP_MUXCR_PSEL(0);
CMP0_CR1 |= CMP_CR1_COS_MASK | CMP_CR1_EN_MASK; /* 使能CMP为直通模式 */
}
BOOLEAN cmpOutput(void)
{
if(CMP0_SCR & CMP_SCR_COUT_MASK) { /* 判断CMP输出情况 */
return 1;
} else {
return 0;
}
}
|