找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2329|回復: 0
收起左側

飛思卡爾單片機初始化程序

[復制鏈接]
ID:871563 發(fā)表于 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; /*設不使用外部觸發(fā)*/
  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,正常清除標志,不使用外部觸發(fā),禁止中斷*/
  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-連續(xù)轉換隊列)
  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; /*外部觸發(fā)源設置寄存器,在此設不使用外部觸發(fā)*/
  115.                 /* ATD Control Register 1
  116.                  *  
  117.                  *  0b10000111
  118.                  *    ||||||||__ ETRIGCH2
  119.                  *    |||||||___ ETRIGCH2
  120.                  *    ||||||____ ETRIGCH2
  121.                  *    |||||_____|
  122.                  *    ||||______|
  123.                  *    |||_______|保留
  124.                  *    ||________|
  125.                  *    |_________ ETRIGSEL(0-開放外部觸發(fā);1-禁止)
  126.                  */
  127.                  
  128. ATD1CTL2=0x80; /*設16通道ATD1模塊為使能A/D,正常清除標志,不使用外部觸發(fā)*/
  129.                 /* ATD Control Register 2
  130.                  *  
  131.                  *  0b10000000
  132.                  *    ||||||||__ ATD Sequence Complete Interrupt Flag(1-有序列轉換完成中斷發(fā)生,0-無)
  133.                  *    |||||||___ ATD Sequence Complete Interrupt Enable(1-使能序列轉換完成中斷)
  134.                  *    ||||||____ External Trigger Mode Enable(0-禁止外部觸發(fā);1-使能外部觸發(fā))
  135.                  *    |||||_____ External Trigger Polarity
  136.                  *    ||||______ ETRIGLE(External Trigger Level/Edge Control)外部觸發(fā)邊沿控制
  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-連續(xù)轉換隊列)
  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,則為真,一直空循環(huán)*/
  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,則為真,一直循環(huán)*/
  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)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表