找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1471|回复: 0
收起左侧

飞思卡尔单片机初始化程序

[复制链接]
ID:871563 发表于 2021-1-4 09:36 | 显示全部楼层 |阅读模式
飞思卡尔单片机AD采集初始化函数,各频率PWM输出设置,延时函数。


  1. void SecondDelay(unsigned int x)   //define delay time program about xs
  2. {
  3. unsigned char i,j,k,m;
  4. while(x--)
  5. {
  6. for(i=0;i<10;i++)
  7. for(j=0;j<12;j++)
  8. for(k=0;k<100;k++)
  9. for(m=0;m<100;m++)
  10. {;}
  11. }
  12. }

  13. void mSecondDelay(unsigned int x)   //define delay time program about xs
  14. {
  15. unsigned char i,j,k,m;
  16. while(x--)
  17. {
  18. for(i=0;i<10;i++)
  19. for(j=0;j<12;j++)
  20. for(k=0;k<10;k++)
  21. for(m=0;m<1;m++)
  22. {;}
  23. }
  24. }



  25. void ATD0Initial(void)
  26. {

  27. ATD0CTL0=0x00; /*多通道转换时,确定ANO转换完成后的下一个要转换的通道号*/
  28.                 /*ATD Control Register 0
  29.                               *  0b00000000
  30.                  *    ||||||||__ WRAP0
  31.                  *    |||||||___ WRAP1
  32.                  *    ||||||____ WRAP2
  33.                  *    |||||_____ 保留
  34.                  */
  35. ATD0CTL1=0x87; /*设不使用外部触发*/
  36.                 /* ATD Control Register 1
  37.                  *  
  38.                  *  0b10000111
  39.                  *    ||||||||__ ETRIGCH2
  40.                  *    |||||||___ ETRIGCH2
  41.                  *    ||||||____ ETRIGCH2
  42.                  *    |||||_____|
  43.                  *    ||||______|
  44.                  *    |||_______|保留
  45.                  *    ||________|
  46.                  *    |_________ ETRIGSEL(0-开放;1-禁止)
  47.                  */
  48. ATD0CTL2=0x80; /*设8通道ATD0模块为正常工作模式,使能A/D,正常清除标志,不使用外部触发,禁止中断*/
  49.                 /* ATD Control Register 2
  50.                  *  
  51.                  *  0b10000000
  52.                  *    ||||||||__ ATD Sequence Complete Interrupt Flag
  53.                  *    |||||||___ ATD Sequence Complete Interrupt Enable
  54.                  *    ||||||____ External Trigger Mode Enable
  55.                  *    |||||_____ External Trigger Polarity
  56.                  *    ||||______ External Trigger Level/Edge Control
  57.                  *    |||_______ ATD Power Down inWait Mode
  58.                  *    ||________ ATD Fast Flag Clear All(0 ATD flag clearing operates normally)
  59.                  *    |_________ ATD Power Up(0 Power down ATD;1 Normal ATD functionality)
  60.                  */
  61. ATD0CTL3=0x08; /*队列长度为1,即只转换1个通道*/
  62.                                  /* ATD Control Register 3
  63.                  *  
  64.                  *  0b00001000
  65.                  *    ||||||||__ FRZ0
  66.                  *    |||||||___ FRZ1
  67.                  *    ||||||____ FIFO
  68.                  *    |||||_____ S1C
  69.                  *    ||||______ S2C
  70.                  *    |||_______ S4C
  71.                  *    ||________ S8C
  72.                  *    |_________ 保留
  73.                  */

  74. ATD0CTL4=0x21; /*10位精度,A/D转换的第二阶段为4个A/D转换周期,4分频*/
  75.                              /* ATD Control Register 4
  76.                  *  
  77.                  *  0b00100000
  78.                  *    ||||||||__ PRS0
  79.                  *    |||||||___ PRS1
  80.                  *    ||||||____ PRS2
  81.                  *    |||||_____ PRS3
  82.                  *    ||||______ PRS4
  83.                  *    |||_______ SMP0
  84.                  *    ||________ SMP1
  85.                  *    |_________ SRES8(0-10位精度;1-8位精度)
  86.                  */

  87. ATD0CTL5=0x80; /*右对齐,无符号,单通道转换模式,选择模拟通道0*/
  88.                                  /* ATD Control Register 5
  89.                  *  
  90.                  *  0b10000000
  91.                  *    ||||||||__ CA采样通道0
  92.                  *    |||||||___ CB
  93.                  *    ||||||____ CC
  94.                  *    |||||_____ 保留
  95.                  *    ||||______ MULT(0-单通道采样;1-多通道采样)
  96.                  *    |||_______ SCAN(0-单次转换队列;1-连续转换队列)
  97.                  *    ||________ DSGN(0-无符号;1-有符号)
  98.                  *    |_________ DJM(0-左对齐;1-右对齐)
  99.                  */
  100. ATD0DIEN=0x00;         /*数字输入允许寄存器,禁止数字输入*/

  101. }

  102. void ATD1Initial(void)
  103. {
  104. /*AD转换器2的设置*/

  105. ATD1CTL0=0x00; /*多通道转换时,确定ANO转换完成后的下一个要转换的通道号*/
  106.                 /*ATD Control Register 0
  107.                               *  0b00000000
  108.                  *    ||||||||__ WRAP0
  109.                  *    |||||||___ WRAP1
  110.                  *    ||||||____ WRAP2
  111.                  *    |||||_____ WRAP3         
  112.                  *    ||||______ 保留
  113.                  */
  114. ATD1CTL1=0x87; /*外部触发源设置寄存器,在此设不使用外部触发*/
  115.                 /* ATD Control Register 1
  116.                  *  
  117.                  *  0b10000111
  118.                  *    ||||||||__ ETRIGCH2
  119.                  *    |||||||___ ETRIGCH2
  120.                  *    ||||||____ ETRIGCH2
  121.                  *    |||||_____|
  122.                  *    ||||______|
  123.                  *    |||_______|保留
  124.                  *    ||________|
  125.                  *    |_________ ETRIGSEL(0-开放外部触发;1-禁止)
  126.                  */
  127.                  
  128. ATD1CTL2=0x80; /*设16通道ATD1模块为使能A/D,正常清除标志,不使用外部触发*/
  129.                 /* ATD Control Register 2
  130.                  *  
  131.                  *  0b10000000
  132.                  *    ||||||||__ ATD Sequence Complete Interrupt Flag(1-有序列转换完成中断发生,0-无)
  133.                  *    |||||||___ ATD Sequence Complete Interrupt Enable(1-使能序列转换完成中断)
  134.                  *    ||||||____ External Trigger Mode Enable(0-禁止外部触发;1-使能外部触发)
  135.                  *    |||||_____ External Trigger Polarity
  136.                  *    ||||______ ETRIGLE(External Trigger Level/Edge Control)外部触发边沿控制
  137.                  *    |||_______ AWAI(ATD Power Down inWait Mode)0-在等待模式正常运行,1-省电模式
  138.                  *    ||________ AFFC(ATD Fast Flag Clear All)(0 ATD flag clearing operates normally)
  139.                  *    |_________ ADPU(ATD Power Up)(0 Power down ATD;1 Normal ATD functionality)
  140.                  */
  141. ATD1CTL3=0x08; /*探制转换序列的长度,此处设队列长度为1,即只转换一个通道,最大长度为16*/
  142.                 /* ATD Control Register 3
  143.                  *  
  144.                  *  0b00001000
  145.                  *    ||||||||__ FRZ0
  146.                  *    |||||||___ FRZ1
  147.                  *    ||||||____ FIFO
  148.                  *    |||||_____ S1C|1
  149.                  *    ||||______ S2C|0
  150.                  *    |||_______ S4C|0
  151.                  *    ||________ S8C|0长度为1
  152.                  *    |_________ 保留
  153.                  */
  154. ATD1CTL4=0x21; /*设置转换精度,采样 时间,ATD时钟分频,在此设10位精度,A/D转换的第二阶段为4个A/D转换周期,4分频*/
  155.                 /* ATD Control Register 4
  156.                  *  
  157.                  *  0b00100000
  158.                  *    ||||||||__ PRS0
  159.                  *    |||||||___ PRS1
  160.                  *    ||||||____ PRS2
  161.                  *    |||||_____ PRS3
  162.                  *    ||||______ PRS4 00000即2分频
  163.                  *    |||_______ SMP0=1
  164.                  *    ||________ SMP1=0 4个ATD时钟周期
  165.                  *    |_________ SRES8(0-10位精度;1-8位精度)
  166.                  */
  167. ATD1CTL5=0x80; /*设置数据格式,扫瞄方式,采样方式,采样通道,在此设右对齐,无符号,单次转换队列模式,单通道采样,选择模拟通道0*/
  168.                 /* ATD Control Register 5
  169.                  *  
  170.                  *  0b10000000
  171.                  *    ||||||||__ CA=0
  172.                  *    |||||||___ CB=0
  173.                  *    ||||||____ CC=0
  174.                  *    |||||_____ CD=0  采样通道0
  175.                  *    ||||______ MULT(0-单通道采样;1-多通道采样)
  176.                  *    |||_______ SCAN(0-单次转换队列;1-连续转换队列)
  177.                  *    ||________ DSGN(0-无符号;1-有符号)
  178.                  *    |_________ DJM(0-左对齐;1-右对齐)
  179.                  */
  180. ATD1DIEN0=0x00;         /*数字输入允许寄存器,禁止数字输入*/
  181. ATD1DIEN1=0x00;         /*数字输入允许寄存器,禁止数字输入*/

  182. }



  183. unsigned int ATD0Sample(unsigned char ADChannel)
  184. {                           
  185.   ATD0CTL5=0x80;
  186.   ATD0CTL5+=ADChannel;                 /*ADChannel可设为0-7,则可选择0-7中的任一通道*/
  187.   while(ATD0STAT0_SCF==0){};     /*等待当前队列转换完成,当转换正在进行SCF=0,则为真,一直空循环*/
  188.   ATD0STAT0_SCF=1;               /*当置SCF为1时,将使该标志位清零*/
  189.   return ATD0DR0;
  190. }

  191. unsigned int ATD1Sample(unsigned char ADChannel)
  192. {
  193.   ATD1CTL5=0x80;
  194.   ATD1CTL5+=ADChannel;
  195.   while(ATD1STAT0_SCF==0){}; /*等待当前队列转换完成,!逻辑非,当转换正在进行SCF=0,则为真,一直循环*/
  196.   ATD1STAT0_SCF=1;           /*当置SCF为1时,将使该标志位清零*/
  197.   return ATD1DR0;
  198.   
  199. }


  200. /*平均值滤波函数*/
  201. float ResultsMeanAverageFilter(unsigned char SelectATDConverter,unsigned char i)
  202. {
  203.     unsigned char count,j,k;
  204.     unsigned int valueBuf[N];
  205.     unsigned int temp;
  206.     unsigned int sum=0;
  207.    
  208.    if(SelectATDConverter==0)           /*当使用转换器0进行采样时的处理函数*/
  209.    
  210.    {
  211.    
  212.     for (count=0;count<N;count++)
  213.    {
  214.      valueBuf[count]=ATD0Sample(i);
  215.     }

  216.      for (count=1;count<N-1;count++)
  217.     {
  218.       sum+=valueBuf[count];
  219.      }
  220.       return ((float)sum/(N-2));
  221.       
  222.    }
  223.    
  224.       if(SelectATDConverter==1)           /*当使用转换器1进行采样时的处理函数*/
  225.    
  226.    {
  227.    
  228.     for (count=0;count<N;count++)
  229.    {
  230.      valueBuf[count]=ATD1Sample(i);
  231.     }

  232.      for (count=1;count<N-1;count++)
  233.     {
  234.       sum+=valueBuf[count];
  235.      }
  236.       return ((float)sum/(N-2));   
  237.    }
  238.    
  239. }
  240.         
  241. /*限幅滤波函数*/
  242. unsigned int ResultsLimiteFilter(unsigned char SelectATDConverter,unsigned char i,unsigned char A)  
  243. {

  244.     unsigned int a[2];
  245.     if(SelectATDConverter==0)           /*当使用转换器0进行采样时的处理函数*/
  246.    {         
  247.     a[0]=ATD0Sample(i);
  248.     a[1]=ATD0Sample(i);
  249.     if ((a[1]-a[0]>A)||(a[0]-a[1]>A))      
  250.     {return a[0];}
  251.     else
  252.     {return a[1];}
  253.    }
  254.    
  255.     if(SelectATDConverter==1)     /*当使用转换器1进行采样时的处理函数*/
  256.    {         
  257.     a[0]=ATD1Sample(i);
  258.     a[1]=ATD1Sample(i);
  259.     if ((a[1]-a[0]>A)||(a[0]-a[1]>A))      
  260.     {return a[0];}
  261.     else
  262.     {return a[1];}
  263.    }
  264.    
  265. }


  266. void PWM_Initial(void)
  267. {
  268.   PWMPOL=0x00;    /*PWM脉宽极性选择,初始输出为低电平*/
  269.   PWMCLK=0xff;    /*选择SA,SB时钟*/
  270.   PWMPRCLK=0x22;  /*A,B时钟预分频为4总线时钟频率*/
  271.   PWMCAE=0x00;    /*PWM波形采用左对齐模式*/
  272.   PWMCTL=0x00;    /*设置通道为独立工作模式*/
  273.   PWMSCLA=60;     /*A的时间常数为60*/
  274.   PWMSCLB=60;
  275.   PWMPER0=100;   /*0-7通道250hz*/
  276.   PWMPER1=0x63;   /*0x63对应数值为99*/
  277.   PWMPER2=0x63;
  278.   PWMPER3=0x63;
  279.   PWMPER4=0x63;
  280.   PWMPER5=0x63;
  281.   PWMPER6=0x63;
  282.   PWMPER7=0x63;
  283.   PWME=0xff;      /*PWM使能寄存器,使能8路PWM控制*/
  284.   PWMDTY0=100;      /*各通道占空比初始化为0*/
  285.   PWMDTY1=100;
  286.   PWMDTY2=100;
  287.   PWMDTY3=100;
  288.   PWMDTY4=100;
  289.   PWMDTY5=100;
  290.   PWMDTY6=100;
  291.   PWMDTY7=100;
  292. }

  293. void PWM_Initial0_5khz(void)
  294. {
  295.   PWMPOL=0x00;    /*PWM脉宽极性选择,初始输出为低电平*/
  296.   PWMCLK=0xff;    /*选择SA,SB时钟*/
  297.   PWMPRCLK=0x00;  /*A,B时钟预分频为0总线时钟频率*/
  298.   PWMCAE=0x00;    /*PWM波形采用左对齐模式*/
  299.   PWMCTL=0x00;    /*设置通道为独立工作模式*/
  300.   PWMSCLA=60;     /*A的时间常数为60*/
  301.   PWMSCLB=60;
  302.   PWMPER0=100;   /*0-7通道1khz*/
  303.   PWMPER1=100;   /*0x63对应数值为99*/
  304.   PWMPER2=100;
  305.   PWMPER3=100;
  306.   PWMPER4=100;
  307.   PWMPER5=100;
  308.   PWMPER6=100;
  309.   PWMPER7=100;
  310.   PWME=0xff;      /*PWM使能寄存器,使能8路PWM控制*/
  311.   PWMDTY0=100;      /*各通道占空比初始化为0*/
  312.   PWMDTY1=100;
  313.   PWMDTY2=100;
  314.   PWMDTY3=100;
  315.   PWMDTY4=100;
  316.   PWMDTY5=100;
  317.   PWMDTY6=100;
  318.   PWMDTY7=100;
  319. }


  320. void PWM_Initial2khz(void)
  321. {
  322.   PWMPOL=0x00;    /*PWM脉宽极性选择,初始输出为低电平*/
  323.   PWMCLK=0xff;    /*选择SA,SB时钟*/
  324.   PWMPRCLK=0x00;  /*A,B时钟预分频为0总线时钟频率*/
  325.   PWMCAE=0x00;    /*PWM波形采用左对齐模式*/
  326.   PWMCTL=0x00;    /*设置通道为独立工作模式*/
  327.   PWMSCLA=30;     /*A的时间常数为30*/
  328.   PWMSCLB=30;
  329.   PWMPER0=100;   /*0-7通道1khz*/
  330.   PWMPER1=100;   /*0x63对应数值为99*/
  331.   PWMPER2=100;
  332.   PWMPER3=100;
  333.   PWMPER4=100;
  334.   PWMPER5=100;
  335.   PWMPER6=100;
  336.   PWMPER7=100;
  337.   PWME=0xff;      /*PWM使能寄存器,使能8路PWM控制*/
  338.   PWMDTY0=100;      /*各通道占空比初始化为0*/
  339.   PWMDTY1=100;
  340.   PWMDTY2=100;
  341.   PWMDTY3=100;
  342.   PWMDTY4=100;
  343.   PWMDTY5=100;
  344.   PWMDTY6=100;
  345.   PWMDTY7=100;
  346. }

  347. void PWM_Initial3khz(void)
  348. {
  349.   PWMPOL=0x00;    /*PWM脉宽极性选择,初始输出为低电平*/
  350.   PWMCLK=0xff;    /*选择SA,SB时钟*/
  351.   PWMPRCLK=0x00;  /*A,B时钟预分频为0总线时钟频率*/
  352.   PWMCAE=0x00;    /*PWM波形采用左对齐模式*/
  353.   PWMCTL=0x00;    /*设置通道为独立工作模式*/
  354.   PWMSCLA=20;     /*A的时间常数为60*/
  355.   PWMSCLB=20;
  356.   PWMPER0=100;   /*0-7通道1khz*/
  357.   PWMPER1=100;   /*0x63对应数值为99*/
  358.   PWMPER2=100;
  359.   PWMPER3=100;
  360.   PWMPER4=100;
  361.   PWMPER5=100;
  362.   PWMPER6=100;
  363.   PWMPER7=100;
  364.   PWME=0xff;      /*PWM使能寄存器,使能8路PWM控制*/
  365.   PWMDTY0=100;      /*各通道占空比初始化为0*/
  366.   PWMDTY1=100;
  367.   PWMDTY2=100;
  368.   PWMDTY3=100;
  369.   PWMDTY4=100;
  370.   PWMDTY5=100;
  371.   PWMDTY6=100;
  372.   PWMDTY7=100;
  373. }

  374. void PWM_Initial4khz(void)
  375. {
  376.   PWMPOL=0x00;    /*PWM脉宽极性选择,初始输出为低电平*/
  377.   PWMCLK=0xff;    /*选择SA,SB时钟*/
  378.   PWMPRCLK=0x00;  /*A,B时钟预分频为0总线时钟频率*/
  379.   PWMCAE=0x00;    /*PWM波形采用左对齐模式*/
  380.   PWMCTL=0x00;    /*设置通道为独立工作模式*/
  381.   PWMSCLA=15;     /*A的时间常数为60*/
  382.   PWMSCLB=15;
  383.   PWMPER0=100;   /*0-7通道1khz*/
  384.   PWMPER1=100;   /*0x63对应数值为99*/
  385.   PWMPER2=100;
  386.   PWMPER3=100;
  387.   PWMPER4=100;
  388.   PWMPER5=100;
  389.   PWMPER6=100;
  390.   PWMPER7=100;
  391.   PWME=0xff;      /*PWM使能寄存器,使能8路PWM控制*/
  392.   PWMDTY0=100;      /*各通道占空比初始化为0*/
  393.   PWMDTY1=100;
  394.   PWMDTY2=100;
  395.   PWMDTY3=100;
  396.   PWMDTY4=100;
  397.   PWMDTY5=100;
  398.   PWMDTY6=100;
  399.   PWMDTY7=100;
  400. }

复制代码

51hei.png

头文件51hei下载地址:
SubFunctions.7z (2.88 KB, 下载次数: 2)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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