[KF8V] KF8V系列运放模块例程

[复制链接]
102|0
 楼主 | 2018-9-25 22:09 | 显示全部楼层 |阅读模式
  1. /****************************************************************************************
  2. * KF8V系列单片机开发板演示程序
  3. * 标         题: 运算放大器模块实验
  4. * 项  目  名: 16-Operational_Amplifier_TEST
  5. * 开发环境:ChipON IDE
  6. * 版          本: V2.0 (2015/10/10)
  7. * 使用芯片:KF8V216
  8. * 作          者:上海芯旺微电子技术有限公司
  9. * 功能简述: 使能运算放大器模块,运算放大器的输出

  10. *************************************************************************************/
  11. #include<KF8V216.h>

  12. #define uchar unsigned char
  13. #define uint  unsigned int

  14. #define         NUM1_IO        P0LR4
  15. #define         NUM2_IO        P0LR5

  16. //主函数
  17. uchar num_1,num_2;
  18. uint dis_adc;


  19. void DelayMs (uint Num)
  20. {
  21.         uint        cnt;
  22.         while(Num--)
  23.         {
  24.                 cnt=2000;
  25.                 while(cnt--);
  26.         }
  27. }




  28. void DelayUs (uint Num)
  29. {
  30.         while (Num--);
  31. }






  32. void Delay_200us()
  33. {
  34.         uchar i = 240;
  35.         while(--i);
  36. }
  37. //;***************************************************************
  38. //; 函  数 名:void Delay50Us()
  39. //;功能函数:延时函数,50us
  40. //;入口参数:无
  41. //;返回参数:无
  42. //;***************************************************************
  43. void Delay50Us()
  44. {
  45.         char cnt ;
  46.         cnt = 30;
  47.         while(cnt--);
  48. }



  49. void init (void)
  50. {
  51.     OSCCTL = 0x70;                           //设置为16M
  52.         /*********端口初始化***********/
  53.         TR0 = 0xcf;                                                 //设置P0端口         1100 1111
  54.         TR1 = 0x00;                                                 //设置P1端口        0000 0000
  55.         P0 = 0;
  56.         P1 = 0;
  57.         P0LR=0;
  58.         P1LR=0;

  59.         NUM1_IO=1;
  60.         NUM2_IO=1;
  61.         /*********AD初始化***********/
  62.         ANSEL = 0x07;                              //设置通道2为模拟口 0000 0111

  63.         ADCCTL0 = 0x89;                   //右对齐,通道OPOUT, AD使能打开
  64.         ADCCTL1 = 0x17;                              //8分频,VDD作为参考电压

  65.         /*********运放初始化***********/
  66.         AMPCTL=0X01;                //0000 0001
  67. }


  68. //;***************************************************************
  69. //; 函  数 名:Operational_init()
  70. //;功能函数:运放自校正函数
  71. //;入口参数:无
  72. //;返回参数:无
  73. //;函数  模拟运放口需要先设置为模拟输入,运放校正后,输出失调将降到最低,输出失调可以降低到3mv内左右。
  74. //;***************************************************************
  75. void Operational_init (void)
  76. {
  77.         unsigned char val_AMPCALI,first_back_up,i,shift_data;

  78.                 AMPON = 1;                //开启运放
  79.                 //延迟,给一个输出缓冲时间
  80.                 Delay50Us();

  81.                 CALIEN = 1;                //开启自校准
  82.                 //延迟,给一个输出缓冲时间
  83.                 Delay50Us();
  84.                 Delay50Us();
  85.                 Delay50Us();

  86.                 //读出AMPCTL中的第7位(CALID)放入AMPCALI中的最高位,用于正负失调判断,次高位置1,其它位设置为全0
  87.                 first_back_up = AMPCTL & 0x80;                //保存第一次的值,用于以后判断的标准
  88.                 val_AMPCALI = first_back_up;                //得到AMPCALI的第7位

  89.                 //bit6-bit2 采用二分法获得最佳值,方法是先把该位 置1,如果和第一次相比翻转了就把该位清0,进行下一位的判断,否则直接进行下一位的判断
  90.                 shift_data = 0B01000000;                                                //位置1或清0        ,初始值为 bit6
  91.                 for(i = 0; i < 4; i++)                                                        //计数,bit6-bit3 只需要循环4次
  92.                 {
  93.                         val_AMPCALI = val_AMPCALI | shift_data;                //位置1
  94.                         AMPDT = val_AMPCALI;
  95.                         //延迟,给一个输出缓冲时间
  96.                         Delay50Us();





  97.                         if(first_back_up != (AMPCTL & 0x80))                //和第一次相比,如果翻转,当前位清0,不翻转直接跳过
  98.                         {
  99.                                 val_AMPCALI = val_AMPCALI ^ shift_data;        //清0
  100.                         }
  101.                         shift_data = shift_data >> 1;                                //右移一位,进行下一位的置1准备
  102.                 }

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


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

  119. void main()
  120. {

  121.         init ();

  122.         Operational_init();
  123.         while (1);

  124. }
  125. //中断函数0:0X04入口地址
  126. void int_fun0() __interrupt (0)
  127. {

  128. }


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

  132. }

复制代码


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

本版积分规则

快速回复

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

论坛热帖

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