这个
电路是为了与目标电压进行比较,如果比目标电压高,COMP_CSR2_CMP2OUT输出高,如果比目标电压低,COMP_CSR2_CMP2OUT输出低。代码能实现这个功能,输出结果与预期的一致,但是为什么用万用表测两输入端的电压都被拉高了,不接到
单片机上时用万用表测为1.5V,但是接到单片机上会被拉到2.3V。不知道是什么原因,请教一下各位高手。
#include
unsigned int count=0;
unsigned char on_off=0; //on 1 off 0
void delay(unsigned int ms)
{
unsigned int x , y;
for(x = ms; x > 0; x--)
for(y = 1000 ; y > 0 ; y--);
}
void COMPInit() //组2中PC3/4/7 组8中PD0/1/PE5
{
CLK_PCKENR2_PCKEN25=1;
//Close the I/O switch of any I/O of group 3 by set
ting CH7E in RI_IOSR1 or CH8E in RI_IOSR2 or CH9E in RI_IOSR3.
//
COMP_CSR3_INSEL=COMP_CSR3_INSEL|0x01;//选择负向输入端001 = I/O (Group 2 of I/Os
PD_DDR_bit.DDR1 = 0; //GPB->PIN2 设置端口PB->2的输入输出方向寄存器为输入方向
PB_CR1_bit.C11 = 0; //GPB->PIN2 Floating without
//PB_CR2_bit.C21 = 1; //GPB->PIN2 使能外部中断
PC_DDR_bit.DDR4 = 0; //GPB->PIN2 设置端口PB->2的输入输出方向寄存器为输入方向
PC_CR1_bit.C14 = 0; //GPB->PIN2 Floating without
//PC_CR2_bit.C24 = 1; //GPB->PIN2 使能外部中断
RI_IOSR1_bit.CH4E=1; //PC7 IO关
RI_IOSR2_bit.CH5E=1; //PC4 IO关
RI_IOSR3_bit.CH6E=1; //PC3 IO关
RI_IOSR1_bit.CH22E=1; //PD1 IO关
RI_IOSR2_bit.CH23E=1; //PD0 IO关
//RI_IOSR3_bit.CH4E=1; //PE5 IO关
COMP_CSR2_CMP2=COMP_CSR2_CMP2|0x03; //11: Event detection on both rising/falling edges of comparator 2 output
RI_ASCR1_bit.AS7=1; // I/O groups and selection PD1 +
RI_ASCR1_bit.AS1=1; // I/O groups and selection PC4 -
}
void LED1Init()
{
//LED1 GPIO INIT
PD_DDR_bit.DDR5 = 1; //设置端口PD->5的输入输出方向寄存器为输出方向
PD_CR1_bit.C15 = 1; //设置PD->5为推挽输出
PD_CR2_bit.C25 = 1; //设置PD->5的输出速率为10MHZ
//LED2 GPIO INIT
PB_DDR_bit.DDR0 = 1; //设置端口PB->0的输入输出方向寄存器为输出方向
PB_CR1_bit.C10 = 1; //设置PB->0为推挽输出
PB_CR2_bit.C20 = 1; //设置PB->0的输出速率为10MHZ
//LED3 GPIO INIT
PB_DDR_bit.DDR1 = 1; //设置端口PB->1的输入输出方向寄存器为输出方向
PB_CR1_bit.C11 = 1; //设置PB->1为推挽输出
PB_CR2_bit.C21 = 1; //设置PB->1的输出速率为10MHZ
//LED4 GPIO INIT
PD_DDR_bit.DDR6 = 1; //设置端口PD->6的输入输出方向寄存器为输出方向
PD_CR1_bit.C16 = 1; //设置PD->6为推挽输出
PD_CR2_bit.C26 = 1; //设置PD->6的输出速率为10MHZ
}
int main(void)
{
//asm("sim"); //关总中断
//CLK_CKDIVR = 0x00; //内部时钟为1分频 系统时钟为16MHZ
LED1Init(); //初始化LED1
COMPInit();
//asm("rim"); //打开系统总中断
while(1) //主程序循环LED2闪,当有中断时,先运行中断,等中断运行完了才运行主程序
{
PB_ODR_bit.ODR0=1; //LED2灭
delay(100);
PB_ODR_bit.ODR0=0; //LED2亮
delay(100);
if(COMP_CSR2_CMP2OUT==1)
{ PB_ODR_bit.ODR1=1; //PD1高 LED3闪
delay(100);
PB_ODR_bit.ODR1=0;
delay(100);
}
if(COMP_CSR2_CMP2OUT==0)
{PD_ODR_bit.ODR6=1; //PC4高 LED4闪
delay(100);
PD_ODR_bit.ODR6=0;
delay(100);
}
}
}