[KF8F] KF8F系列运放校正使能例程

[复制链接]
94|0
 楼主 | 2018-9-25 22:07 | 显示全部楼层 |阅读模式
  1. /****************************************************************************************
  2. *
  3. * 文件名: main.c
  4. * 项目名: op_test
  5. * 版 本: v1.0
  6. * 日 期: 2016年05月23日 17时24分50秒
  7. * 作 者: Administrator
  8. *
  9. ****************************************************************************************/
  10. #include<KF8F4156.h>



  11. #define uchar unsigned char
  12. #define uint  unsigned int
  13. void Delay_200us()
  14. {
  15.         uchar i = 240;
  16.         while(--i);
  17. }
  18. //;***************************************************************
  19. //; 函  数 名:void Delay50Us()
  20. //;功能函数:延时函数,50us
  21. //;入口参数:无
  22. //;返回参数:无
  23. //;***************************************************************
  24. void Delay50Us()
  25. {
  26.         char cnt ;
  27.         cnt = 30;
  28.         while(cnt--);
  29. }
  30. /*****************************************************
  31. * 函数名称:initFun()
  32. * 函数功能:运放校正使能
  33. * 输入:        无
  34. * 输出:        无
  35. *
  36. *
  37. ***************************************************** */
  38. void        OP_fun()
  39. {
  40.         unsigned char val_AMPCALI,first_back_up,i,shift_data;
  41.         INPS1 = 0;                //设置运放正向输入口 P2.3
  42.         INPS0 = 1;
  43.         AMPON =1;                //运放使能
  44.         //延迟,给一个输出缓冲时间
  45.         Delay50Us();
  46.         AMPCALEN = 1;                //开启自校准
  47.         //延迟,给一个输出缓冲时间
  48.         Delay50Us();
  49.         Delay50Us();
  50.         Delay50Us();
  51.         //读出AMPCTL中的第7位(CALID)放入AMPCALI中的最高位,用于正负失调判断,次高位置1,其它位设置为全0
  52.         first_back_up = AMPCTL & 0x80;                //保存第一次的值,用于以后判断的标准
  53.         val_AMPCALI = first_back_up;                //得到AMPCALI的第7位
  54.         //bit6-bit2 采用二分法获得最佳值,方法是先把该位 置1,如果和第一次相比翻转了就把该位清0,进行下一位的判断,否则直接进行下一位的判断
  55.         shift_data = 0B01000000;                                                //位置1或清0        ,初始值为 bit6
  56.         for(i = 0; i < 4; i++)                                                        //计数,bit6-bit3 只需要循环4次
  57.         {
  58.                 val_AMPCALI = val_AMPCALI | shift_data;                //位置1
  59.                 AMPDT = val_AMPCALI;
  60.                 //延迟,给一个输出缓冲时间
  61.                 Delay50Us();
  62.                 if(first_back_up != (AMPCTL & 0x80))                //和第一次相比,如果翻转,当前位清0,不翻转直接跳过
  63.                 {
  64.                         val_AMPCALI = val_AMPCALI ^ shift_data;        //清0
  65.                 }
  66.                 shift_data = shift_data >> 1;                                //右移一位,进行下一位的置1准备
  67.         }

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


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

  84. }



  85. /*****************************************************
  86. * 函数名称:initFun()
  87. * 函数功能:IO口初始化
  88. * 输入:        无
  89. * 输出:        无
  90. *
  91. *
  92. ***************************************************** */
  93. void initFun()
  94. {
  95.         OSCCTL = 0X70;
  96.         TR0 = 0b00000100;
  97.         TR1 = 0b00000000;
  98.         TR2 = 0b00111000;
  99.         TR3 = 0b00000000;

  100.         P0LR = 0b00000000;
  101.         P1LR = 0b00000100;
  102.         P2LR = 0b00000000;
  103.         P3LR = 0b00000000;

  104.         ANSEL = 0b00111000;

  105. }



  106. void DelayMs (uint Num)
  107. {
  108.         uint        cnt;
  109.         while(Num--)
  110.         {
  111.                 cnt=2000;
  112.                 while(cnt--);
  113.         }
  114. }
  115. //主函数
  116. void main()
  117. {

  118.         initFun();
  119.         DelayMs(50);
  120.         OP_fun();
  121.         while(1);
  122. }
  123. //中断函数0:0X04入口地址
  124. void int_fun0() __interrupt (0)
  125. {

  126. }


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

  130. }
复制代码


扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表