电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【dsPIC33】振荡器与定时器
分 享
扫描二维码分享
【dsPIC33】振荡器与定时器
dsPIC33
振荡器
定时器
KVIN
关注
发布时间: 2019-10-16
丨
阅读: 2079
# 前言 上节是做了dsPIC的准备工作,熟悉了开发环境与一些基本配置位的操作,项目种选用dsPIC芯片目的还是用来做电机控制的,对于电机控制来说,PWM,ADC,定时器是非常重要的功能,本节就开始介绍dsPIC的时钟配置,并使用定时器来验证。 首先,接入电路中的外部晶振是8M晶振,因此根据手册,可以选择主振荡器Posc: ![](https://cf02.ickimg.com/bbsimages/201909/11a1c478d17cf1e07cb600bff00815b0.png) ![](https://cf02.ickimg.com/bbsimages/201909/74b6228d8a5314509a809db6de5bbdea.png) ![](https://cf02.ickimg.com/bbsimages/201909/a48da0b3ecb93a4fd7d56b42c0815190.png) 根据上表,选择带PLL的主振荡器,由于使用的是XT晶振,因此使用XT模式,之后,修改配置位: ![](https://cf02.ickimg.com/bbsimages/201909/6d7d9da023c19f23298751f5216f3792.png) 生成代码为: ```c // FOSC #pragma config POSCMD = XT // 主振荡器模式选择位(XT晶体振荡器模式) #pragma config OSCIOFNC = OFF // OSC2 Pin Function bit (OSC2 is clock output) #pragma config IOL1WAY = ON // Peripheral pin select configuration (Allow only one reconfiguration) #pragma config FCKSM = CSDCMD // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are disabled) // FOSCSEL #pragma config FNOSC = PRIPLL // 振荡器源选择(带PLL模块的主振荡器(XT + PLL,HS + PLL,EC + PLL)) #pragma config PWMLOCK = ON // PWM Lock Enable bit (Certain PWM registers may only be written after key sequence) #pragma config IESO = ON // Two-speed Oscillator Start-up Enable bit (Start up device with FRC, then switch to user-selected oscillator source) ``` 之后要做的便是时钟计算,根据我们的配置来计算出我们现在的各个频率是多少。dsPIC33 PLL框图如下: ![](https://cf02.ickimg.com/bbsimages/201909/907dfe634aab26585809108ed613eb02.png) ![](https://cf02.ickimg.com/bbsimages/201909/a0ce406c9df7a4c87dfd50bd340088ad.png) 公式中: N1对应 CLKDIV寄存器的PLLPRE位 N2对应 PLLFBD寄存器的PLLDIV位 M对应 CLKDIV的PLLPOST位 此时我们需要将Fosc锁定在120M,此时系统的工作频率即为60M,由于晶振使用的是8M晶振,因此,取N1 = 2,N2 = 2,M = 60 **按照手册的说明:系统的工作频率为Fosc频率的一半。** 代码如下: ```c //产生Fosc = 120MHz CLKDIVbits.PLLPRE = 0; //N1 = 2 PLLFBDbits.PLLDIV = 58; //M = 60 CLKDIVbits.PLLPOST = 0; //N2 = 2 8 * (60 / (2 + 2)) = 120M while (OSCCONbits.COSC!= 0b011) while (OSCCONbits.LOCK!= 1) {};//PLL 处于锁定状态 ``` ![](https://cf02.ickimg.com/bbsimages/201909/c237a6ead39d38e5f1139e3fc4c3ac65.png) 配置完成,那么接下来就是验证我们配置的60M频率对不对,就使用一个定时器来验证好了。 关于dsPIC33的定时器,是把他们分成了三类,ABC三类定时器,如果要使用32位定时器,可以使用B类与C类定时器组合构成23位定时器,此时B类定时器控制寄存器中的T32控制位(TxCON<3>)必须置1,对于32位的工作,C类定时器保存最高有效字(即高16位),而B类定时器保存最低有效字(即低16位)。具体的32位定时器的使用,手册中直接给出了例子,因此就不再赘述。现在使用一个普通定时器来验证时钟就好,我选用的是timer3,C类定时器。 现在使用timer3来构造一个4ms的定时器,然后在中断里翻转一个IO口的电平状态来验证。 ![](https://cf02.ickimg.com/bbsimages/201909/dd046fe04fb09c8b50909bbbc7dbf992.png) ![](https://cf02.ickimg.com/bbsimages/201909/866eea149f193714c4799bcab0a2f54f.png) 定时时间为4ms,因此设置分频率为1:8 T3CONbits.TCKPS = 0x01;//输入时钟预分频比1:8 周期寄存器的值为30000,(主频为60M) PR3 = 30000; **注意:timer3定时器的优先级寄存器为 IPC2 timer1的优先级寄存器为 IPC0** 程序如下: ```c void Tim3_Init() { T3CONbits.TON = 0;//禁止16位Timer3 T3CONbits.TCS = 0;//内部时钟Fosc/2 60M T3CONbits.TGATE = 0;//门控时间累加位 禁止 T3CONbits.TCKPS = 0x01;//输入时钟预分频比1:8 TMR3 = 0; //初始值 相当于CNT PR3 = 30000; //由于是8分频,也就是7.5M频率 因此取30000为定时4ms IPC2bits.T3IP = 0x03; // 优先级1 定时器3的中断优先级为 IPC2 定时器1为IPC0 IFS0bits.T3IF = 0; // Timer3中断标志状态位 清零 IEC0bits.T3IE = 1; // Timer3中断允许位 允许 T3CONbits.TON = 1; //启动使能16位Timer3 } void __attribute__((__interrupt__, no_auto_psv)) _T3Interrupt(void) { static uint8_t led_flag = 0; IFS0bits.T3IF = 0; //清楚中断标志 led_flag = 1 - led_flag; if (led_flag == 0) { PORTAbits.RA4 = 0; } else { PORTAbits.RA4 = 1; } } ``` 实验结果: ![](https://cf02.ickimg.com/bbsimages/201909/433731823f86fd3582b7d4ab7dcfb09d.png) 时钟正确。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
KVIN
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交