本次所做实验为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;
}
}
void redLedSet(BOOLEAN bMode) //判断并决定LED现在应该是什么状态{
if(bMode == True) {
FGPIOB_PCOR |= 1<<18;
} else {
FGPIOB_PSOR |= 1<<18;
}
}
int main (void)
{
INT8U ucdacOut = 1.50 * 64 / 2.90; //设置DA输出的值,即输入值与其比较(通道7)
SystemCoreClockUpdate();
gpioInit();
cmpInit(ucdacOut);
while(1){
redLedSet(cmpOutput());
};
}
|