打印
[KungFu8位 MCU]

KF8F系列运放校正使能例程

[复制链接]
950|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xujunyi3611|  楼主 | 2018-9-25 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/****************************************************************************************
*
* 文件名: main.c
* 项目名: op_test
* 版 本: v1.0
* 日 期: 2016年05月23日 17时24分50秒
* 作 者: Administrator
*
****************************************************************************************/
#include<KF8F4156.h>



#define uchar unsigned char
#define uint  unsigned int
void Delay_200us()
{
        uchar i = 240;
        while(--i);
}
//;***************************************************************
//; 函  数 名:void Delay50Us()
//;功能函数:延时函数,50us
//;入口参数:无
//;返回参数:无
//;***************************************************************
void Delay50Us()
{
        char cnt ;
        cnt = 30;
        while(cnt--);
}
/*****************************************************
* 函数名称:initFun()
* 函数功能:运放校正使能
* 输入:        无
* 输出:        无
*
*
***************************************************** */
void        OP_fun()
{
        unsigned char val_AMPCALI,first_back_up,i,shift_data;
        INPS1 = 0;                //设置运放正向输入口 P2.3
        INPS0 = 1;
        AMPON =1;                //运放使能
        //延迟,给一个输出缓冲时间
        Delay50Us();
        AMPCALEN = 1;                //开启自校准
        //延迟,给一个输出缓冲时间
        Delay50Us();
        Delay50Us();
        Delay50Us();
        //读出AMPCTL中的第7位(CALID)放入AMPCALI中的最高位,用于正负失调判断,次高位置1,其它位设置为全0
        first_back_up = AMPCTL & 0x80;                //保存第一次的值,用于以后判断的标准
        val_AMPCALI = first_back_up;                //得到AMPCALI的第7位
        //bit6-bit2 采用二分法获得最佳值,方法是先把该位 置1,如果和第一次相比翻转了就把该位清0,进行下一位的判断,否则直接进行下一位的判断
        shift_data = 0B01000000;                                                //位置1或清0        ,初始值为 bit6
        for(i = 0; i < 4; i++)                                                        //计数,bit6-bit3 只需要循环4次
        {
                val_AMPCALI = val_AMPCALI | shift_data;                //位置1
                AMPDT = val_AMPCALI;
                //延迟,给一个输出缓冲时间
                Delay50Us();
                if(first_back_up != (AMPCTL & 0x80))                //和第一次相比,如果翻转,当前位清0,不翻转直接跳过
                {
                        val_AMPCALI = val_AMPCALI ^ shift_data;        //清0
                }
                shift_data = shift_data >> 1;                                //右移一位,进行下一位的置1准备
        }

        //bit2 bit1 bit0 采用累加方式确定临界值,这里只要翻转必定是临界值,校准直接完成
        for(i = 0; i < 8; i++)
        {
                //延迟,给一个输出缓冲时间
                AMPDT = val_AMPCALI;
                Delay50Us();
                Delay50Us();


                if(first_back_up != (AMPCTL & 0x80))                //和第一次相比,如果翻转,当前位清0,不翻转直接跳过
                {
                        AMPCALEN = 0;                                                                //关闭自校准使能,运放2可以进行采样,运放2已经使能,不需要重新打开
                        return;
                }
                val_AMPCALI++;                                                                //累加判断
        }
        AMPCALEN = 0;                                                                        //关闭自校准使能,运放2可以进行采样,运放2已经使能,不需要重新打开
        return;

}



/*****************************************************
* 函数名称:initFun()
* 函数功能:IO口初始化
* 输入:        无
* 输出:        无
*
*
***************************************************** */
void initFun()
{
        OSCCTL = 0X70;
        TR0 = 0b00000100;
        TR1 = 0b00000000;
        TR2 = 0b00111000;
        TR3 = 0b00000000;

        P0LR = 0b00000000;
        P1LR = 0b00000100;
        P2LR = 0b00000000;
        P3LR = 0b00000000;

        ANSEL = 0b00111000;

}



void DelayMs (uint Num)
{
        uint        cnt;
        while(Num--)
        {
                cnt=2000;
                while(cnt--);
        }
}
//主函数
void main()
{

        initFun();
        DelayMs(50);
        OP_fun();
        while(1);
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{

}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}


发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

376

帖子

2

粉丝