dsp 28335 ConfigCpuTimer()详细介绍

本文深入解析了DSP28335的CPU定时器配置方法,通过实例说明如何设置定时器频率与周期,以实现精确的定时中断。文章纠正了常见的误解,并详细解释了ConfigCpuTimer函数的参数意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转至:dsp 28335 ConfigCpuTimer()详细介绍 博主:timleee

我自己的理解;写的不一定对,还请多指教;(博主还是很谦逊的!!)

从网上看到的好多都是复制粘贴的一个版本,感觉不太对

图上的是系统时钟(SYSCLKOUT)=75MHz;

ConfigCpuTimer(&CpuTimer0, 150, 500000);

这样不太现实,系统时钟跑75M次是1s,你cpu定时器跑150M才是1s,怎么可能?TPR里的TDDRH:TDDR没法设置啊,不可能让他们等于1/2吧!所以我觉得这说的不对;

下图是我们在程序中经常见到的对cpu定时器的设置;

从注释中可以知道,CPU定时器的时钟频率是150Mhz时(区别于系统时钟SYSCLKOUT),(500000是定时器一个周期的时间,应该就是设定的时间T)每50ms会发生一次中断;怎么实现的呢?

CPUFreqInMHz这个是cpu定时器的频率,由ConfigCpuTimer()的Freq可知为150,单位为Mhz;(区别于系统时钟  SYSCLKOUT),

CPU的定时器时钟周期即:TIMCLK=(TDDRH:TDDR+1)x(1/SYSCLKOUT),他的倒数就是cpu定时器的频率,已知函数中自定义的Freq就是频率,那么就可以求得(TDDRH:TDDR)的值了;Freq是等于系统时钟频率的所以TDDR是1;在这里

这样设置TPR(即PSC+TDDR)就表示定时器的时钟等于系统时钟;

为什么将(Freq*Period)赋给PRD?PRD是定时器周期寄存器,意思应该就是定时器从开始到发出中断的时间,让它走(Freq*Period)个定时器周期,停止然后中断;

ConfigCpuTimer(&CpuTimer0, 150, 500000);由此函数知

T(想要的定时时间/定时器周期)=TIMCLK*(PRDH:PRD)==>(PRDH:PRD)=T/TIMCLK=T*Freq;

(比如说系统时钟150MHz,即一个周期是6.67ns;由PRD知运行的系统周期是500000x150=75000000个;75000000x6.666667=500000250ns,大约就是0.5s);

ConfigCpuTimer(&CpuTimer0, 75, 500000);

即:cpu定时器的频率是75MHz,即每两个系统时钟周期代表一个CPU定时器周期;那么时间就变位2x6.666667ns(1/75);

我需要的一个定时器周期是500000us,一个周期是(1/75M)s,那么我就需要500000x75个这样的周期,所以PRDH:PRD就被设置为75*500000=37.5M;

(PRDH:PRD)*2x6.666667ns=0.5s;

### 关于DSP28335简单开环控制程序 对于希望了解如何使用TMS320F28335 DSP实现简单的开环控制系统,特别是针对电机控制的应用场景而言,下面提供了简化版的开环V/F(电压/频率)控制方案概述以及相应的代码片段。 #### 开环V/F控制原理简介 在开环模式下操作时,并不需要反馈信号来调节输出。相反,输入给定的速度指令被转换成对应的电压水平,该过程通常依赖预定义的比例关系——即所谓的V/F曲线。这种类型的控制器非常适合那些对精度要求不高但追求成本效益高的应用场景[^2]。 #### 主要组件说明 - **硬件资源**: 使用TI公司生产的TMS320F28335作为主控芯片。 - **软件工具链**: Code Composer Studio (CCS),这是官方推荐并广泛使用的集成开发环境IDE。 - **外设接口**: PWM模块用于生成逆变器所需的脉宽调制信号;ADC通道负责采集传感器数据(如果存在的话),不过在此处我们讨论的是纯粹的开环情况所以可能不会涉及到具体的传感部分。 #### 程序结构概览 整个项目的框架围绕几个关键函数构建: - `main()` 函数:应用程序入口点,在此完成系统的初始化工作之后进入无限循环等待事件触发; - V/F 控制逻辑:根据设定的目标转速计算出合适的PWM占空比值; - 中断服务例程ISR:响应定时器中断更新PWM周期内的高电平持续时间以改变最终输出至电动机绕组上的平均电压大小。 下面是`Main.c`中的核心伪代码表示形式: ```c #include "DSP2833x_Device.h" // Device Headerfile and Examples Include File #include "DSP2833x_Examples.h" void main(void){ InitSysCtrl(); // 初始化系统控制寄存器 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBEN = 1; // 启用定时器使能位 EDIS; DINT; // 禁止全局中断 IER = 0x0000; // 清除IER寄存器 IFR = 0x0000; // 清除IFR寄存器 InitPieCtrl(); // 初始化PIE控制寄存器 InitPieVectTable(); // 初始化PIE向量表 InitGpio(); // GPIO端口初始化 ConfigCpuTimer(&CpuTimer0, 200, 60000); // 配置CPU计数器0为每秒一次溢出 CpuTimer0.InterruptCount = 0; while(1){ // 进入死循环 __asm(" NOP"); __asm(" NOP"); } } interrupt void cpu_timer0_isr(void) { static float frequency_setpoint = BASE_FREQUENCY_HZ; // 设定的基础频率Hz static unsigned int duty_cycle = calculate_duty_from_frequency(frequency_setpoint); set_pwm_output(duty_cycle); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 承认本次中断请求 } ``` 上述代码展示了基本的项目启动流程和一个典型的定时器中断处理程序样例。其中包含了必要的外围设备初始化步骤,比如GPIO配置、定时器设置等。此外还定义了一个名为`cpu_timer0_isr` 的中断服务子程序(ISR), 它会在每次定时器超时时被执行,从而允许定期调整施加到电机上的电压等级。 请注意这只是一个非常基础的例子,实际应用中还需要考虑更多细节如参数校准、异常检测等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值