LLLM平台软件设计小结.docx
《LLLM平台软件设计小结.docx》由会员分享,可在线阅读,更多相关《LLLM平台软件设计小结.docx(7页珍藏版)》请在冰点文库上搜索。
LLLM平台软件设计小结
LL、LM平台软件设计小结
在平台设计过程中我们不断学习研究,一步一步的为平台建设积累经验方法。
短短的几个星期,我们从数据手册开始,逐步开始软件平台的建设。
从头文件的定义到函数名的确定,从基本功能的实现到函数功能的优化,从底层软件的整合到各个模块功能联调,我们从中学到了知识,得到了提高,完善了平台建设的思想方法。
总结归纳失败的经验如下几点:
1.ADC函数模块
我们在ADC滤波中调用采样函数,为减少全局变量的定义和使用,我们将采样值以返回数组首地址的形式返回给指针类型的函数名以备滤波时使用。
经仿真证明该方法有效。
#ifADC
/*******************************************************
Function:
ADC_Init()
Description:
Calls:
CalledBy:
Input:
Output:
Return:
Others:
*******************************************************/
voidADC_Init(void)
{
ADCON0=0x01;//使能ADC,连接任何通道0
ADCON1=0x90;//右对齐,转换时钟Fosc/8,VREF+=VDD,VREF-=VSS
}
/*******************************************************
Function:
ADC_Sample()
Description:
实现对指定AD通道进行数据采集,将数据存于数组中
Calls:
CalledBy:
API_ADC_Filter()
Input:
AD采集通道
Output:
Return:
Others:
*******************************************************/
unsignedint*ADC_Sample(unsignedcharChannel,unsignedcharSample_Times)
{
unsignedchari;
unsignedintAdc_Data[12];
GO_nDONE=1;
for(i=0;i{
ADCON0bits.CHS=Channel;//AD采集通道选择
if(!
GO_nDONE)
{
GO_nDONE=1;
Adc_Data[i]=ADRESH;
Adc_Data[i]=Adc_Data[i]<<8|ADRESL;
}
}
GO_nDONE=0;
return&Adc_Data[0];
}
/*******************************************************
Function:
API_ADC_Filter()
Description:
Calls:
ADC_Sample()
CalledBy:
Input:
AD采集通道
Output:
Return:
AD滤波结果
Others:
*******************************************************/
unsignedintAPI_ADC_Filter(unsignedcharChannel)
{
unsignedcharFilter_Method;
unsignedint*pData;
unsignedcharSample_Times;
Filter_Method=Adc_Table[0][Channel];//滤波方式选择
Sample_Times=Adc_Table[1][Channel];//采集次数
pData=ADC_Sample(Channel,Sample_Times);
/**************滤波处理****************************/
if(Filter_Method==0)//中位值平均滤波法
{
unsignedchari;
unsignedintAdc_Max,Adc_Min,Adc_Result;
Adc_Max=0;
Adc_Min=0xffff;
Adc_Result=0;
for(i=0;i{
if(*pData>Adc_Max)
Adc_Max=*pData;
if(*pDataAdc_Min=*pData;
Adc_Result+=*pData;
pData++;
}
Adc_Result=(Adc_Result-Adc_Max-Adc_Min)/(Sample_Times-2);
returnAdc_Result;
}
elseif(Filter_Method==1)//中位值滤波法
{
unsignedchari,j;
unsignedintAdc_Result,Buf[12];
for(i=0;i{
Buf[i]=*(pData+i);
}
for(i=0;i{
for(j=0;j{
if(Buf[j]>Buf[j+1])
{
Buf[j]^=Buf[j+1];
Buf[j+1]^=Buf[j];
Buf[j]^=Buf[j+1];
}
}
}
if(Sample_Times%2)
Adc_Result=Buf[(Sample_Times-2)/2];
else
Adc_Result=Buf[(Sample_Times-1)/2];
returnAdc_Result;
}
else
return0;
/*******************滤波处理结束***********************/
}
#endif
2.CCP模块(输入捕获、输出比较、PWM输出)
之前设计的捕获和PWM函数功能不够完善,对于捕获函数我们将函数分为初始化、中断处理、有效参数返回三大块。
在配置的过程中我们在不断犯错的过程中不断研习相关数据手册,总结在改编输入捕获的模式的时候要先关闭输入捕获中断允许位,防止产生错误中断,且要先关闭该模块然后重新设置模块的工作方式(哪个调变沿产生中断)。
最终在不断仿真调试后不断修改完成相对比较完整使用的输入捕获函数底层软件的编写。
对于PWM我们,在按照数据手册设计的函数不符合实用要求,我们尝试改变设置方法,调整相关寄存器设置,将该模块分为时钟初始化函数,PWM初始化函数和占空比设置函数。
实现了占空比(0~100)%可调。
#ifCCP1==3
/*******************************************************
Function:
Pwm_Channel1_SetDuty()
Description:
设置标准型PWM通道1参数
Calls:
CalledBy:
Input:
Output:
Return:
Others:
*******************************************************/
voidPwm_Channel1_Init(void)
{
TRISC1=1;//禁止CCP1引脚输出驱动器。
CCP1CONbits.CCP1M=0x0c;//配置为标准PWM
PR2=TIM2_Period;//周期设置
T2CONbits.T2CKPS=TIM2_Prescaler;//设置timer2预分频比0,1,2,3
Pwm_Channel1_SetDuty(0);//默认占空比0%
CCPTMRS0bits.C1TSEL=0;//CCP1以Timer2为时基
TMR2IF=0;//清除定时器2中断标志位
TMR2ON=1;//使能定时器2
while(!
TMR2IF);//等待定时器2上溢中断
TRISC1=0;//使能CCP1引脚输出驱动器。
}
voidPwm_Channel1_SetDuty(unsignedcharDuty)
{
unsignedinttemp1;
unsignedinttemp;
temp1=((TIM2_Period+1)*4);
temp=temp1*Duty/100;
CCPR1L=(unsignedchar)(temp>>2);//占空比高八位设置
CCP1CONbits.DC1B=(unsignedchar)temp;//占空比低两位设置
}
/*******************************************************
Function:
Pwm_Channel1_On()
Description:
设置标准型PWM通道1参数
Calls:
CalledBy:
Input:
Output:
Return:
Others:
*******************************************************/
voidPwm_Channel1_On()
{
CCP1CONbits.CCP1M=0x0c;//使能CCP1(PWM)//使能CCP1引脚输出驱动器。
}
/*******************************************************
Function:
Pwm_Channel1_Off()
Description:
设置标准型PWM通道1参数
Calls:
CalledBy:
Input:
Output:
Return:
Others:
*******************************************************/
voidPwm_Channel1_Off()
{
CCP1CONbits.CCP1M=0x00;//禁止CCP1(PWM)//使能CCP1引脚输出驱动器。
}
#endif
其他模块函数功能我们也将在不断的调试过程中进行有效的改进和完善,为平台建设积累经验不断完善平台的同时也不断的努力提高自己的实际工作能力和水平。