标题:
飞思卡尔单片机初始化程序
[打印本页]
作者:
shuobugaosu
时间:
2021-1-4 09:36
标题:
飞思卡尔单片机初始化程序
飞思卡尔单片机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.png
(4.47 KB, 下载次数: 46)
下载附件
2021-1-4 14:56 上传
头文件51hei下载地址:
SubFunctions.7z
(2.88 KB, 下载次数: 2)
2021-1-4 14:57 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1