1、LLLM平台软件设计小结LL、LM平台软件设计小结在平台设计过程中我们不断学习研究,一步一步的为平台建设积累经验方法。短短的几个星期,我们从数据手册开始,逐步开始软件平台的建设。从头文件的定义到函数名的确定,从基本功能的实现到函数功能的优化,从底层软件的整合到各个模块功能联调,我们从中学到了知识,得到了提高,完善了平台建设的思想方法。总结归纳失败的经验如下几点:1.ADC函数模块我们在ADC滤波中调用采样函数,为减少全局变量的定义和使用,我们将采样值以返回数组首地址的形式返回给指针类型的函数名以备滤波时使用。经仿真证明该方法有效。#if ADC/*Function: ADC_Init() De
2、scription: Calls: Called By: Input: Output: Return: Others: */void ADC_Init(void) ADCON0 = 0x01; /使能ADC,连接任何通道0 ADCON1 = 0x90; /右对齐,转换时钟Fosc/8,VREF+=VDD,VREF-=VSS/*Function: ADC_Sample() Description: 实现对指定AD通道进行数据采集,将数据存于数组中 Calls: Called By:API_ADC_Filter() Input: AD采集通道 Output: Return: Others: */u
3、nsigned int *ADC_Sample(unsigned char Channel, unsigned char Sample_Times) unsigned char i; unsigned int Adc_Data12; GO_nDONE = 1; for (i=0; iSample_Times; i+) ADCON0bits.CHS = Channel;/AD采集通道选择 if (!GO_nDONE) GO_nDONE = 1; Adc_Datai = ADRESH; Adc_Datai = Adc_Datai 8 |ADRESL; GO_nDONE=0; return &Adc
4、_Data0;/*Function: API_ADC_Filter() Description: Calls: ADC_Sample() Called By: Input: AD采集通道 Output: Return: AD滤波结果 Others: */unsigned int API_ADC_Filter(unsigned char Channel) unsigned char Filter_Method; unsigned int *pData; unsigned char Sample_Times; Filter_Method = Adc_Table0Channel; /滤波方式选择 S
5、ample_Times = Adc_Table1Channel; /采集次数 pData = ADC_Sample(Channel, Sample_Times); /*滤波处理*/ if(Filter_Method = 0) /中位值平均滤波法 unsigned char i; unsigned int Adc_Max,Adc_Min,Adc_Result; Adc_Max = 0; Adc_Min = 0xffff; Adc_Result = 0; for (i=0; i Adc_Max) Adc_Max = *pData; if (*pData Adc_Min) Adc_Min = *pD
6、ata; Adc_Result += *pData; pData+; Adc_Result = (Adc_Result - Adc_Max - Adc_Min) / (Sample_Times-2); return Adc_Result; else if(Filter_Method = 1) /中位值滤波法 unsigned char i,j; unsigned int Adc_Result,Buf12; for (i = 0; i Sample_Times; i+) Bufi=*(pData + i); for (i = 0; i Sample_Times - 1; i+) for (j =
7、 0; j Bufj+1) Bufj = Bufj+1; Bufj+1 = Bufj; Bufj = Bufj+1; if(Sample_Times%2) Adc_Result = Buf(Sample_Times - 2)/2; else Adc_Result = Buf(Sample_Times - 1)/2; return Adc_Result; else return 0; /*滤波处理结束*/#endif2.CCP模块(输入捕获、输出比较、PWM输出)之前设计的捕获和PWM函数功能不够完善,对于捕获函数我们将函数分为初始化、中断处理、有效参数返回三大块。在配置的过程中我们在不断犯错的
8、过程中不断研习相关数据手册,总结在改编输入捕获的模式的时候要先关闭输入捕获中断允许位,防止产生错误中断,且要先关闭该模块然后重新设置模块的工作方式(哪个调变沿产生中断)。最终在不断仿真调试后不断修改完成相对比较完整使用的输入捕获函数底层软件的编写。对于PWM我们,在按照数据手册设计的函数不符合实用要求,我们尝试改变设置方法,调整相关寄存器设置,将该模块分为时钟初始化函数,PWM初始化函数和占空比设置函数。实现了占空比(0100)%可调。#if CCP1 = 3/*Function: Pwm_Channel1_SetDuty() Description:设置标准型PWM通道1参数 Calls:
9、Called By: Input: Output: Return: Others: */ void Pwm_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; /清除定时
10、器2中断标志位 TMR2ON=1; /使能定时器2 while(!TMR2IF); /等待定时器2上溢中断 TRISC1=0; /使能CCP1 引脚输出驱动器。 void Pwm_Channel1_SetDuty(unsigned char Duty) unsigned int temp1; unsigned int temp; temp1=(TIM2_Period+1)*4); temp=temp1*Duty/100; CCPR1L=(unsigned char) (temp2); /占空比高八位设置 CCP1CONbits.DC1B=(unsigned char) temp; /占空比低两
11、位设置/*Function: Pwm_Channel1_On() Description:设置标准型PWM通道1参数 Calls: Called By: Input: Output: Return: Others: */ void Pwm_Channel1_On() CCP1CONbits.CCP1M=0x0c; /使能CCP1(PWM) /使能CCP1 引脚输出驱动器。 /*Function: Pwm_Channel1_Off() Description:设置标准型PWM通道1参数 Calls: Called By: Input: Output: Return: Others: */ void Pwm_Channel1_Off() CCP1CONbits.CCP1M=0x00; /禁止CCP1(PWM) /使能CCP1 引脚输出驱动器。 #endif其他模块函数功能我们也将在不断的调试过程中进行有效的改进和完善,为平台建设积累经验不断完善平台的同时也不断的努力提高自己的实际工作能力和水平。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1