PIC16(L)F18324/18344微控制器的Timer2/4/6模块与PWM功能解析

需积分: 46 47 下载量 156 浏览量 更新于2024-08-08 收藏 5.02MB PDF 举报
"节“Timer2/4/6模块”-大话存储(终极版) - PIC16F18324 单片机" 在微控制器领域,定时器是核心组件之一,尤其是在嵌入式系统中。此处讨论的是PIC16F18324单片机中的Timer2/4/6模块,这些定时器可以被配置为执行多种功能,包括标准PWM(脉宽调制)模式。标准PWM模式允许在PWMx引脚上生成高10位分辨率的PWM信号,这对于电机控制、LED亮度调节等应用非常有用。 PWM模式的配置涉及几个关键寄存器: 1. **TMR2、TMR4或TMR6寄存器**:这些寄存器用于计数,决定了PWM周期。 2. **PR2、PR4或PR6寄存器**:这些预分频器寄存器用于设定定时器的周期,与TMR寄存器配合确定PWM的总周期。 3. **PWMxCON寄存器**:这个控制寄存器用于设置PWM模式、极性以及其他控制位。 4. **PWMxDCH和PWMxDCL寄存器**:这两个寄存器组合起来设置PWM的占空比,决定了脉冲宽度。 PWM的输出状态由PWMPOL位决定,默认情况下,如果PWMPOL为0,则输出为低电平;若为1,则输出为高电平。PWMEN位用于启用或禁用PWM输出,当其为0时,输出将保持默认状态。 为了在PWMx引脚上启用PWM输出,必须将相应的TRIS位清零,这意味着将该引脚配置为输出。此外,定时器的时钟源可以通过相关寄存器进行选择,提供了更多的灵活性。 PIC16F18324单片机是一款具有众多外设和低功耗特性的微控制器。它的核心特性包括: - **C编译器优化的RISC架构**:48条指令,适用于高效的C语言编程。 - **工作频率**:最高可达32MHz,最小指令周期125ns。 - **中断系统**:支持16级深的硬件堆栈和多个中断源。 - **定时器资源**:包括4个8位定时器和3个16位定时器,用于各种计时任务。 - **电源管理**:具备POR、PWRT、BOR和LPBOR,确保设备在不同电源条件下的稳定运行。 - **安全特性**:如可编程代码保护,保护程序不被非法访问。 存储方面,该芯片有7KB的闪存程序存储器、512字节数据SRAM和256字节EEPROM。寻址模式包括直接、间接和相对模式,方便数据访问。 在功耗方面,PIC16F18324体现了超低功耗(XLP)设计,如休眠模式下仅40nA的电流消耗,以及在不同工作模式下的低电流特性。此外,它提供了空闲模式、打盹模式和休眠模式,以及PMD功能来进一步降低未使用外设的功耗。 数字外设功能强大,包括可配置逻辑单元(CLC)、比较捕获PWM(CCP)和PWM模块,以及通信外设,增强了设计的灵活性和适用性。PPS功能使得数字外设的引脚映射可以按需配置,优化了电路板布局。 PIC16F18324单片机在提供高效能计算能力的同时,兼顾了低功耗的需求,特别适合于需要精确定时和功率管理的嵌入式应用。Timer2/4/6模块在标准PWM模式下的灵活配置,使其成为实现复杂控制算法的理想选择。

/* * Record.c * * Created on: 2014-5-26 * Author: zdl */ #include "includes.h" char *const Display_Name[]={ "Music List", "1-Beyond.wav", "2-LetItG.wav", "3-WeAreO.wav", "4-FanFan.wav", "5-OldBoy.wav", "6-Sodagr.wav", "7-WangF1.wav", "8-WangF2.wav", "9-Mayday.wav", "10-StevC.wav", }; void Music_Graph() { SysTickDisable(); //---------Draw Title---------- ui8Flush_Flag=FLUSH_ON; GrClearDisplay(&g_sContext); GrFlush(&g_sContext); } void Music_Begin() { DSTATUS i=1; SystemClock=SysCtlClockGet(); //----------------硬件初始化--------------- DAC_Init(); //初始化DAC //-------------------初始化SD卡-------------------- while(i==1)// 使用文件系统初始化SD卡 i=disk_initialize(0); //-------------------初始化Timer------------------- SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); TimerDisable(TIMER1_BASE, TIMER_A); TimerConfigure(TIMER1_BASE, TIMER_CFG_A_PERIODIC_UP); TimerIntRegister(TIMER1_BASE,TIMER_A,Timer1IntHandler); TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); MAP_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_6); MAP_GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6,GPIO_PIN_6); SysTickEnable(); } void Music_Main() { static uint8_t preDisplay_Num=255,Display_Num=0; while((ui8ButtonKeyValue&KEY_LEFT_ENTER) == 0 &&(ui8ButtonKeyValue&KEY_RIGHT_EXIT)==0) { Display_Num = GetWheelKey(); _nop(); if(Display_Num != preDisplay_Num) { DrawMenu(Display_Num,Display_Name); preDisplay_Num = Display_Num; } SysCtlDelay(SystemClock/100); } if(Music_Enter==1) { GrClearDisplay(&g_sContext); GrStringDrawCentered(&g_sContext, Display_Name[Display_Num], AUTO_STRING_LENGTH, 63, 20, OPAQUE_TEXT); GrContextFontSet(&g_sContext, &g_sFontFixed6x8); GrStringDraw(&g_sContext,"Time:",4,0,53,1); GrStringNumberCentered(&g_sContext,0,0,35+22,57); GrStringDraw(&g_sContext,"-",1,35+9,53,1); GrStringNumberCentered(&g_sContext,0,0,35+2,57); GrStringDraw(&g_sContext,"/",1,35+34,53,1); GrStringNumberCentered(&g_sContext,0,0,35+48,57); GrStringDraw(&g_sContext,"-",1,35+55,53,1); GrStringNumberCentered(&g_sContext,0,0,35+70,57); GrFlush(&g_sContext); ui8Flush_Flag=FLUSH_OFF; WaveOpen(Display_Name[Display_Num],MONO); ui8Flush_Flag=FLUSH_ON; preDisplay_Num=255; ui8ButtonKeyValue&=~(KEY_LEFT_ENTER+KEY_RIGHT_EXIT); } else { preDisplay_Num=255; rcd_ply_sel = 255; } } void Music_Quit() { MAP_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5,0); TimerDisable(TIMER1_BASE, TIMER_A); ui8Flush_Flag=FLUSH_ON; }

2023-07-11 上传
2023-05-12 上传