飞思卡尔单片机AD采集初始化函数,各频率PWM输出设置,延时函数。
- void SecondDelay(unsigned int x) //define delay time program about xs
- {
- unsigned char i,j,k,m;
- while(x--)
- {
- for(i=0;i<10;i++)
- for(j=0;j<12;j++)
- for(k=0;k<100;k++)
- for(m=0;m<100;m++)
- {;}
- }
- }
- void mSecondDelay(unsigned int x) //define delay time program about xs
- {
- unsigned char i,j,k,m;
- while(x--)
- {
- for(i=0;i<10;i++)
- for(j=0;j<12;j++)
- for(k=0;k<10;k++)
- for(m=0;m<1;m++)
- {;}
- }
- }
- void ATD0Initial(void)
- {
-
- ATD0CTL0=0x00; /*多通道转换时,确定ANO转换完成后的下一个要转换的通道号*/
- /*ATD Control Register 0
- * 0b00000000
- * ||||||||__ WRAP0
- * |||||||___ WRAP1
- * ||||||____ WRAP2
- * |||||_____ 保留
- */
- ATD0CTL1=0x87; /*设不使用外部触发*/
- /* ATD Control Register 1
- *
- * 0b10000111
- * ||||||||__ ETRIGCH2
- * |||||||___ ETRIGCH2
- * ||||||____ ETRIGCH2
- * |||||_____|
- * ||||______|
- * |||_______|保留
- * ||________|
- * |_________ ETRIGSEL(0-开放;1-禁止)
- */
- ATD0CTL2=0x80; /*设8通道ATD0模块为正常工作模式,使能A/D,正常清除标志,不使用外部触发,禁止中断*/
- /* ATD Control Register 2
- *
- * 0b10000000
- * ||||||||__ ATD Sequence Complete Interrupt Flag
- * |||||||___ ATD Sequence Complete Interrupt Enable
- * ||||||____ External Trigger Mode Enable
- * |||||_____ External Trigger Polarity
- * ||||______ External Trigger Level/Edge Control
- * |||_______ ATD Power Down inWait Mode
- * ||________ ATD Fast Flag Clear All(0 ATD flag clearing operates normally)
- * |_________ ATD Power Up(0 Power down ATD;1 Normal ATD functionality)
- */
- ATD0CTL3=0x08; /*队列长度为1,即只转换1个通道*/
- /* ATD Control Register 3
- *
- * 0b00001000
- * ||||||||__ FRZ0
- * |||||||___ FRZ1
- * ||||||____ FIFO
- * |||||_____ S1C
- * ||||______ S2C
- * |||_______ S4C
- * ||________ S8C
- * |_________ 保留
- */
-
- ATD0CTL4=0x21; /*10位精度,A/D转换的第二阶段为4个A/D转换周期,4分频*/
- /* ATD Control Register 4
- *
- * 0b00100000
- * ||||||||__ PRS0
- * |||||||___ PRS1
- * ||||||____ PRS2
- * |||||_____ PRS3
- * ||||______ PRS4
- * |||_______ SMP0
- * ||________ SMP1
- * |_________ SRES8(0-10位精度;1-8位精度)
- */
-
- ATD0CTL5=0x80; /*右对齐,无符号,单通道转换模式,选择模拟通道0*/
- /* ATD Control Register 5
- *
- * 0b10000000
- * ||||||||__ CA采样通道0
- * |||||||___ CB
- * ||||||____ CC
- * |||||_____ 保留
- * ||||______ MULT(0-单通道采样;1-多通道采样)
- * |||_______ SCAN(0-单次转换队列;1-连续转换队列)
- * ||________ DSGN(0-无符号;1-有符号)
- * |_________ DJM(0-左对齐;1-右对齐)
- */
- ATD0DIEN=0x00; /*数字输入允许寄存器,禁止数字输入*/
-
- }
- void ATD1Initial(void)
- {
- /*AD转换器2的设置*/
-
- ATD1CTL0=0x00; /*多通道转换时,确定ANO转换完成后的下一个要转换的通道号*/
- /*ATD Control Register 0
- * 0b00000000
- * ||||||||__ WRAP0
- * |||||||___ WRAP1
- * ||||||____ WRAP2
- * |||||_____ WRAP3
- * ||||______ 保留
- */
- ATD1CTL1=0x87; /*外部触发源设置寄存器,在此设不使用外部触发*/
- /* ATD Control Register 1
- *
- * 0b10000111
- * ||||||||__ ETRIGCH2
- * |||||||___ ETRIGCH2
- * ||||||____ ETRIGCH2
- * |||||_____|
- * ||||______|
- * |||_______|保留
- * ||________|
- * |_________ ETRIGSEL(0-开放外部触发;1-禁止)
- */
-
- ATD1CTL2=0x80; /*设16通道ATD1模块为使能A/D,正常清除标志,不使用外部触发*/
- /* ATD Control Register 2
- *
- * 0b10000000
- * ||||||||__ ATD Sequence Complete Interrupt Flag(1-有序列转换完成中断发生,0-无)
- * |||||||___ ATD Sequence Complete Interrupt Enable(1-使能序列转换完成中断)
- * ||||||____ External Trigger Mode Enable(0-禁止外部触发;1-使能外部触发)
- * |||||_____ External Trigger Polarity
- * ||||______ ETRIGLE(External Trigger Level/Edge Control)外部触发边沿控制
- * |||_______ AWAI(ATD Power Down inWait Mode)0-在等待模式正常运行,1-省电模式
- * ||________ AFFC(ATD Fast Flag Clear All)(0 ATD flag clearing operates normally)
- * |_________ ADPU(ATD Power Up)(0 Power down ATD;1 Normal ATD functionality)
- */
- ATD1CTL3=0x08; /*探制转换序列的长度,此处设队列长度为1,即只转换一个通道,最大长度为16*/
- /* ATD Control Register 3
- *
- * 0b00001000
- * ||||||||__ FRZ0
- * |||||||___ FRZ1
- * ||||||____ FIFO
- * |||||_____ S1C|1
- * ||||______ S2C|0
- * |||_______ S4C|0
- * ||________ S8C|0长度为1
- * |_________ 保留
- */
- ATD1CTL4=0x21; /*设置转换精度,采样 时间,ATD时钟分频,在此设10位精度,A/D转换的第二阶段为4个A/D转换周期,4分频*/
- /* ATD Control Register 4
- *
- * 0b00100000
- * ||||||||__ PRS0
- * |||||||___ PRS1
- * ||||||____ PRS2
- * |||||_____ PRS3
- * ||||______ PRS4 00000即2分频
- * |||_______ SMP0=1
- * ||________ SMP1=0 4个ATD时钟周期
- * |_________ SRES8(0-10位精度;1-8位精度)
- */
- ATD1CTL5=0x80; /*设置数据格式,扫瞄方式,采样方式,采样通道,在此设右对齐,无符号,单次转换队列模式,单通道采样,选择模拟通道0*/
- /* ATD Control Register 5
- *
- * 0b10000000
- * ||||||||__ CA=0
- * |||||||___ CB=0
- * ||||||____ CC=0
- * |||||_____ CD=0 采样通道0
- * ||||______ MULT(0-单通道采样;1-多通道采样)
- * |||_______ SCAN(0-单次转换队列;1-连续转换队列)
- * ||________ DSGN(0-无符号;1-有符号)
- * |_________ DJM(0-左对齐;1-右对齐)
- */
- ATD1DIEN0=0x00; /*数字输入允许寄存器,禁止数字输入*/
- ATD1DIEN1=0x00; /*数字输入允许寄存器,禁止数字输入*/
-
- }
- unsigned int ATD0Sample(unsigned char ADChannel)
- {
- ATD0CTL5=0x80;
- ATD0CTL5+=ADChannel; /*ADChannel可设为0-7,则可选择0-7中的任一通道*/
- while(ATD0STAT0_SCF==0){}; /*等待当前队列转换完成,当转换正在进行SCF=0,则为真,一直空循环*/
- ATD0STAT0_SCF=1; /*当置SCF为1时,将使该标志位清零*/
- return ATD0DR0;
- }
- unsigned int ATD1Sample(unsigned char ADChannel)
- {
- ATD1CTL5=0x80;
- ATD1CTL5+=ADChannel;
- while(ATD1STAT0_SCF==0){}; /*等待当前队列转换完成,!逻辑非,当转换正在进行SCF=0,则为真,一直循环*/
- ATD1STAT0_SCF=1; /*当置SCF为1时,将使该标志位清零*/
- return ATD1DR0;
-
- }
- /*平均值滤波函数*/
- float ResultsMeanAverageFilter(unsigned char SelectATDConverter,unsigned char i)
- {
- unsigned char count,j,k;
- unsigned int valueBuf[N];
- unsigned int temp;
- unsigned int sum=0;
-
- if(SelectATDConverter==0) /*当使用转换器0进行采样时的处理函数*/
-
- {
-
- for (count=0;count<N;count++)
- {
- valueBuf[count]=ATD0Sample(i);
- }
- for (count=1;count<N-1;count++)
- {
- sum+=valueBuf[count];
- }
- return ((float)sum/(N-2));
-
- }
-
- if(SelectATDConverter==1) /*当使用转换器1进行采样时的处理函数*/
-
- {
-
- for (count=0;count<N;count++)
- {
- valueBuf[count]=ATD1Sample(i);
- }
- for (count=1;count<N-1;count++)
- {
- sum+=valueBuf[count];
- }
- return ((float)sum/(N-2));
- }
-
- }
-
- /*限幅滤波函数*/
- unsigned int ResultsLimiteFilter(unsigned char SelectATDConverter,unsigned char i,unsigned char A)
- {
- unsigned int a[2];
- if(SelectATDConverter==0) /*当使用转换器0进行采样时的处理函数*/
- {
- a[0]=ATD0Sample(i);
- a[1]=ATD0Sample(i);
- if ((a[1]-a[0]>A)||(a[0]-a[1]>A))
- {return a[0];}
- else
- {return a[1];}
- }
-
- if(SelectATDConverter==1) /*当使用转换器1进行采样时的处理函数*/
- {
- a[0]=ATD1Sample(i);
- a[1]=ATD1Sample(i);
- if ((a[1]-a[0]>A)||(a[0]-a[1]>A))
- {return a[0];}
- else
- {return a[1];}
- }
-
- }
- void PWM_Initial(void)
- {
- PWMPOL=0x00; /*PWM脉宽极性选择,初始输出为低电平*/
- PWMCLK=0xff; /*选择SA,SB时钟*/
- PWMPRCLK=0x22; /*A,B时钟预分频为4总线时钟频率*/
- PWMCAE=0x00; /*PWM波形采用左对齐模式*/
- PWMCTL=0x00; /*设置通道为独立工作模式*/
- PWMSCLA=60; /*A的时间常数为60*/
- PWMSCLB=60;
- PWMPER0=100; /*0-7通道250hz*/
- PWMPER1=0x63; /*0x63对应数值为99*/
- PWMPER2=0x63;
- PWMPER3=0x63;
- PWMPER4=0x63;
- PWMPER5=0x63;
- PWMPER6=0x63;
- PWMPER7=0x63;
- PWME=0xff; /*PWM使能寄存器,使能8路PWM控制*/
- PWMDTY0=100; /*各通道占空比初始化为0*/
- PWMDTY1=100;
- PWMDTY2=100;
- PWMDTY3=100;
- PWMDTY4=100;
- PWMDTY5=100;
- PWMDTY6=100;
- PWMDTY7=100;
- }
- void PWM_Initial0_5khz(void)
- {
- PWMPOL=0x00; /*PWM脉宽极性选择,初始输出为低电平*/
- PWMCLK=0xff; /*选择SA,SB时钟*/
- PWMPRCLK=0x00; /*A,B时钟预分频为0总线时钟频率*/
- PWMCAE=0x00; /*PWM波形采用左对齐模式*/
- PWMCTL=0x00; /*设置通道为独立工作模式*/
- PWMSCLA=60; /*A的时间常数为60*/
- PWMSCLB=60;
- PWMPER0=100; /*0-7通道1khz*/
- PWMPER1=100; /*0x63对应数值为99*/
- PWMPER2=100;
- PWMPER3=100;
- PWMPER4=100;
- PWMPER5=100;
- PWMPER6=100;
- PWMPER7=100;
- PWME=0xff; /*PWM使能寄存器,使能8路PWM控制*/
- PWMDTY0=100; /*各通道占空比初始化为0*/
- PWMDTY1=100;
- PWMDTY2=100;
- PWMDTY3=100;
- PWMDTY4=100;
- PWMDTY5=100;
- PWMDTY6=100;
- PWMDTY7=100;
- }
- void PWM_Initial2khz(void)
- {
- PWMPOL=0x00; /*PWM脉宽极性选择,初始输出为低电平*/
- PWMCLK=0xff; /*选择SA,SB时钟*/
- PWMPRCLK=0x00; /*A,B时钟预分频为0总线时钟频率*/
- PWMCAE=0x00; /*PWM波形采用左对齐模式*/
- PWMCTL=0x00; /*设置通道为独立工作模式*/
- PWMSCLA=30; /*A的时间常数为30*/
- PWMSCLB=30;
- PWMPER0=100; /*0-7通道1khz*/
- PWMPER1=100; /*0x63对应数值为99*/
- PWMPER2=100;
- PWMPER3=100;
- PWMPER4=100;
- PWMPER5=100;
- PWMPER6=100;
- PWMPER7=100;
- PWME=0xff; /*PWM使能寄存器,使能8路PWM控制*/
- PWMDTY0=100; /*各通道占空比初始化为0*/
- PWMDTY1=100;
- PWMDTY2=100;
- PWMDTY3=100;
- PWMDTY4=100;
- PWMDTY5=100;
- PWMDTY6=100;
- PWMDTY7=100;
- }
- void PWM_Initial3khz(void)
- {
- PWMPOL=0x00; /*PWM脉宽极性选择,初始输出为低电平*/
- PWMCLK=0xff; /*选择SA,SB时钟*/
- PWMPRCLK=0x00; /*A,B时钟预分频为0总线时钟频率*/
- PWMCAE=0x00; /*PWM波形采用左对齐模式*/
- PWMCTL=0x00; /*设置通道为独立工作模式*/
- PWMSCLA=20; /*A的时间常数为60*/
- PWMSCLB=20;
- PWMPER0=100; /*0-7通道1khz*/
- PWMPER1=100; /*0x63对应数值为99*/
- PWMPER2=100;
- PWMPER3=100;
- PWMPER4=100;
- PWMPER5=100;
- PWMPER6=100;
- PWMPER7=100;
- PWME=0xff; /*PWM使能寄存器,使能8路PWM控制*/
- PWMDTY0=100; /*各通道占空比初始化为0*/
- PWMDTY1=100;
- PWMDTY2=100;
- PWMDTY3=100;
- PWMDTY4=100;
- PWMDTY5=100;
- PWMDTY6=100;
- PWMDTY7=100;
- }
- void PWM_Initial4khz(void)
- {
- PWMPOL=0x00; /*PWM脉宽极性选择,初始输出为低电平*/
- PWMCLK=0xff; /*选择SA,SB时钟*/
- PWMPRCLK=0x00; /*A,B时钟预分频为0总线时钟频率*/
- PWMCAE=0x00; /*PWM波形采用左对齐模式*/
- PWMCTL=0x00; /*设置通道为独立工作模式*/
- PWMSCLA=15; /*A的时间常数为60*/
- PWMSCLB=15;
- PWMPER0=100; /*0-7通道1khz*/
- PWMPER1=100; /*0x63对应数值为99*/
- PWMPER2=100;
- PWMPER3=100;
- PWMPER4=100;
- PWMPER5=100;
- PWMPER6=100;
- PWMPER7=100;
- PWME=0xff; /*PWM使能寄存器,使能8路PWM控制*/
- PWMDTY0=100; /*各通道占空比初始化为0*/
- PWMDTY1=100;
- PWMDTY2=100;
- PWMDTY3=100;
- PWMDTY4=100;
- PWMDTY5=100;
- PWMDTY6=100;
- PWMDTY7=100;
- }
复制代码
头文件51hei下载地址:
SubFunctions.7z
(2.88 KB, 下载次数: 2)
|