在这篇博客中,我将介绍如何为PIC微控制器配置内部振荡器的频率。通过调整振荡器频率,我们可以控制微控制器的时钟速度,从而影响设备的性能和功耗。
我们将通过几个示例函数展示如何设置不同频率的内部振荡器,从32 MHz到31 kHz不等,帮助你根据应用需求动态调整振荡器频率。
微控制器通常需要在性能和功耗之间取得平衡。运行在较高频率(例如32 MHz)时,性能更强,但功耗也会增加。相反,较低频率(例如31 kHz)适用于低功耗应用,这种情况下速度要求不高。能够动态调整振荡器频率对于减少空闲期间的功耗或在需要时提高性能非常有用。
以下列出的函数负责配置PIC微控制器的内部振荡器到不同的频率。每个函数都会设置振荡器频率选择位(IRCFx)并根据需要启用/禁用锁相环(PLL)。
cvoid internal_32() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 0; IRCF1 = 1; IRCF2 = 1; IRCF3 = 1;
SPLLEN = 1; // 启用PLLx4
}
该函数将内部振荡器设置为 32 MHz,通过配置频率选择位并启用PLL来实现频率倍增。适用于需要全速运行的微控制器。
cvoid internal_16() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 1; IRCF1 = 1; IRCF2 = 1; IRCF3 = 1;
SPLLEN = 0; // 禁用PLLx4
}
该函数将振荡器频率设置为 16 MHz,通过禁用PLL来减少功耗。适用于需要适中性能且不需要32 MHz高功耗的应用。
cvoid internal_8() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 0; IRCF1 = 1; IRCF2 = 1; IRCF3 = 1;
SPLLEN = 0; // 禁用PLLx4
}
8 MHz 是性能和功耗之间的平衡点,适用于不需要高性能处理的任务,并确保节能。
cvoid internal_4() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 1; IRCF1 = 0; IRCF2 = 1; IRCF3 = 1;
SPLLEN = 0; // 禁用PLLx4
}
4 MHz 适用于低功耗场景,例如间歇性处理任务,进一步减少功耗。
cvoid internal_2() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 0; IRCF1 = 0; IRCF2 = 1; IRCF3 = 1;
SPLLEN = 0; // 禁用PLLx4
}
在 2 MHz 频率下,系统的功耗显著降低,适用于耗能要求极低的应用。
cvoid internal_1() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 1; IRCF1 = 1; IRCF2 = 0; IRCF3 = 1;
SPLLEN = 0; // 禁用PLLx4
}
1 MHz 频率适用于超低功耗应用,优先考虑延长电池寿命的项目。
cvoid internal_31() {
SCS0 = 0; SCS1 = 0;
IRCF0 = 0; IRCF1 = 0; IRCF2 = 0; IRCF3 = 0;
SPLLEN = 0; // 禁用PLLx4
}
31 kHz 是低频模式,适用于深度睡眠或其他功耗关键状态,消耗的能量极少,同时保持基本功能。
通过管理PIC微控制器的内部振荡器,开发者可以控制系统的功耗和性能。无论你是在构建高速数据处理系统,还是在开发低功耗的物联网设备,了解如何配置时钟速度将帮助你优化应用程序。
在提供的示例中,通过专门为每个频率设计的函数,内部振荡器的配置变得简单。这些配置允许根据微控制器的处理需求动态调整振荡器频率。
合理平衡功耗和性能,你可以根据项目需求量身定制微控制器的工作方式。
c
/*******************************************************************************
* Function: internal_32()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 32MHz
*
* Usage: internal_32()
******************************************************************************/
//Set to 32MHz
void internal_32(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 0;
IRCF1 = 1;
IRCF2 = 1;
IRCF3 = 1;
//SET PLLx4 ON
SPLLEN = 1;
}
/*******************************************************************************
* Function: internal_16()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 16MHz
*
* Usage: internal_16()
******************************************************************************/
//Set to 16MHz
void internal_16(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 1;
IRCF1 = 1;
IRCF2 = 1;
IRCF3 = 1;
//SET PLLx4 OFF
SPLLEN = 0;
}
/*******************************************************************************
* Function: internal_8()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 8MHz
*
* Usage: internal_8()
******************************************************************************/
//Set to 8MHz
void internal_8(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 0;
IRCF1 = 1;
IRCF2 = 1;
IRCF3 = 1;
//SET PLLx4 OFF
SPLLEN = 0;
}
/*******************************************************************************
* Function: internal_4()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 4MHz
*
* Usage: internal_4()
******************************************************************************/
//Set to 4MHz
void internal_4(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 1;
IRCF1 = 0;
IRCF2 = 1;
IRCF3 = 1;
//SET PLLx4 OFF
SPLLEN = 0;
}
/*******************************************************************************
* Function: internal_2()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 2MHz
*
* Usage: internal_2()
******************************************************************************/
//Set to 2MHz
void internal_2(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 0;
IRCF1 = 0;
IRCF2 = 1;
IRCF3 = 1;
//SET PLLx4 OFF
SPLLEN = 0;
}
/*******************************************************************************
* Function: internal_1()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 1MHz
*
* Usage: internal_1()
******************************************************************************/
//Set to 1MHz
void internal_1(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 1;
IRCF1 = 1;
IRCF2 = 0;
IRCF3 = 1;
//SET PLLx4 OFF
SPLLEN = 0;
}
/*******************************************************************************
* Function: internal_31()
*
* Returns: Nothing
*
* Description: Sets internal oscillator to 31kHz
*
* Usage: internal_31()
******************************************************************************/
//Set to 31kHz(LFINTOSC)
void internal_31(){
//Clock determined by FOSC in configuration bits
SCS0 = 0;
SCS1 = 0;
//Frequency select bits
IRCF0 = 0;
IRCF1 = 0;
IRCF2 = 0;
IRCF3 = 0;
//SET PLLx4 OFF
SPLLEN = 0;
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!