利用msp430 的timer_b 在比较模式下输出的脉宽调制(pwm)

上传人:wt****50 文档编号:35325877 上传时间:2018-03-14 格式:DOC 页数:3 大小:34KB
返回 下载 相关 举报
利用msp430 的timer_b 在比较模式下输出的脉宽调制(pwm)_第1页
第1页 / 共3页
利用msp430 的timer_b 在比较模式下输出的脉宽调制(pwm)_第2页
第2页 / 共3页
利用msp430 的timer_b 在比较模式下输出的脉宽调制(pwm)_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《利用msp430 的timer_b 在比较模式下输出的脉宽调制(pwm)》由会员分享,可在线阅读,更多相关《利用msp430 的timer_b 在比较模式下输出的脉宽调制(pwm)(3页珍藏版)》请在金锄头文库上搜索。

1、利用利用 MSP430 的的 Timer_B 在比较模式下输出的脉宽调制在比较模式下输出的脉宽调制(PWM)1 基本原理基本原理 PWM 信号是一种具有固定周期 T 不定占空比 的数字信号如图 1 所示如果 PWM 信号 的占空比随时间变化那么通过滤波之后的输出信号将是幅度变化的模拟信号因此通过控制 PWM 信号的占空比就可以产生不同的模拟信号在 MSP430F449 中就是采用 CCR0 来控制 周期 T 而用与定时器对应的 CCRx 寄存器来控制可变占空比进而实现 D/A 转换. 2 分辨率分辨率 基于 Timer_B PWM 的 DAC 分辨率就等于计数器的长度通常是 CCR0 寄存器的

2、值 PWM DAC 的最低有效位是一个计数值分辨率是总的计数值 Rcounts = Lcounts 其中 Rcounts 是以计数值为单位的分辨率 Lcounts 是计数器的总计数值例如对 8-bitDAC 计数器 的长度为 8 bits 或者 256 个计数值那么分辨率也就是 8 bits 或者 256 更一般的情况下基于 PWM 定时器和滤波器的 PWM DAC 的分辨率等于产生模拟信号的 PWM 信号的分辨率 PWM 信号的分辨率决定于计数器的长度和 PWM 计数器能够实现的最小占空比用数学表 达式如下 Rcounts =其中 = Lcounts C 是最小占空比比特分辨率用下式计算如果

3、 PWM 计 数器的长度为 512 个计数值最小的占空比为 2 个计数值那么 PWMDAC 的分辨率就为或 者以比特表示. 3 系统频率系统频率 PWM 信号需要的输出频率等于 DAC 的更新频率因为 PWM 信号占空比的每一次变化 等效于一次 DAC 抽样 PWM 定时器所需的频率取决于 PWM 信号频率和所需的分辨率如 下所示图 1 PWM 信号示意图在这儿是所需的 PWM 定时器频率是 PWM 信号的频率也就 是 DAC 的更新频率 n 是所需的比特分辨率下文即将描述怎样采用 8-bit PWM DAC 来同步 产生一个 200Hz 的正弦波由抽样定理可得最低的抽样频率应该为 400Hz

4、 但是通常情况下 PWM 信号的频率要远高于 Nyquist 抽样速率这是因为 PWM 信号的频率越高对滤波器的 阶数就要求越低合适的滤波器越容易实现通常抽样速率取 Nyquist 速率的 16 或者 32 倍. 4. 所需的所需的 MSP430 资源资源 文中的例子是用 MSP430F449 的 Timer_B 再加外部滤波器来产生一个 200Hz 的正弦 波和一个 0.5VCC 的直流电平的将 Timer_B 配置为 16-bit up 模式在这种模式下计数器计 数 CCR0 然后复位从 0 开始重新计数给 CCR0 赋值 255 也就意味着计数器的长度为 8bits CCR1 和 TB1

5、 用于产生正弦波 CCR2 和 TB2 用于产生直流电平输出模式都选为模式 7 即 PWM 复位/置位模式如图 2 所示在这种模式下复位后每一个定时器的输出都为高电平 直到计数器达到各自的 CCRx 值时变为低电平当计数器达到 CCR0 时再置位也就是说 CCRx 的值决定了各自正脉冲的宽带若 CCRx 的值是变化的就可以产生可变宽度的脉冲下 文中的正弦波就是用这种办法产生的若不变则产生的是固定宽度的脉冲下文中的直流电平 就是这样产生的最后 SMCLK 用作 Timer_B 的时钟源系统采用 32768Hz 的钟表晶振通过 采用内部硬件锁频环 FLL frequency-locked-loop

6、 来校准 DCO Digital Control Oscillator 频率 为系统提供 MCLK/SMCLK 时钟图 2 输出模式 7 PWM 复位/置位示意图. 5. 实现电路实现电路 用 Timer_B PWM 实现 DAC 外围电路比较简单如图 3 所示实际上外围电路就是晶振 电路和 RC 低通滤波器图 3 MSP430F449 实现 D/A 电路图. 6 .正弦信号的产生正弦信号的产生 在这个例子中一个正弦波用 32 个抽样值生成正弦波的频率为 200Hz 所以每秒要抽样 20032=6400 次也就是说=6.4KHz 每完成一次抽样要计数 28 所以所需的时钟频率为抽样值 包含在程

7、序开始的一个正弦表中通过调用中断函数在每个 PWM 周期结束时将新的正弦波抽样值载入捕获/比较寄存器 CCR1 中因此产生的 PWM 信号的脉冲宽度就决定了正弦波 在每一个时刻的抽样值将这个 PWM 信号经过低通滤波即得所需的正弦波. 7.直流电平的产生直流电平的产生 直流电平产生比较简单因为它对应的 PWM 占空比是一定的直流电平直接正比于 PWM 信号的占空比要产生 0.5VCC 的直流电平 PWM 的占空比显然是 50% 考虑到损耗实际应 大些只需要简单地将 CCR2 的值设置为 128 并且无须变化就可以得到 50%占空比的 PWM 信号将得到的 PWM 信号通过 RC 网络进行低通滤

8、波即可得到 0.5VCC 的直流电平. 8.滤波器设计滤波器设计 对两路输出都采用了结构简单的 RC 滤波器如图 3 所示之所以采用这种结构一是因为 RC 滤波器结构简单二是为了实现低功耗尽量避免采用有源器件用于交流信号的滤波器是 一个双极点级联 RC 滤波器如果滤波器阶数过高可以采用提高的抽样频率的办法来降低滤 波器阶数滤波器的截至频率 fc 由下式来计算当 R2 = R1 时滤波器的响应较好但是如果截至 频率很接近信号带宽边沿将会导致相当大的衰减因此为了减小滤波器的衰减截至频率应该 大于信号带宽边沿但是要远小于 PWM 信号的频率用于产生直流电平的滤波器仅仅是用来 储存电荷的而不像交流信号

9、滤波器那样用来滤波因此采用了一个简单的单极 RC 滤波器. 9.程序流程程序流程 用 MSP430F449 的 Timer_B 的 PWM 来产生正弦波和直流电平的程序比较简单流程如 图 4 所示 MSP430F449 自身有 FLL 可用它来实现 DCO 的频率校准但是 DCO 的频率只 能锁定在 ACLK 的整数倍上所以对于没有 FLL 的器件或者所需频率不是 ACLK 整数倍的 情况下要用 Timer_A 或者其它的定时器进行 DCO 频率校准这也就是所谓的“软锁频“ 事 实上实际的 D/A 转换常常是一些随时间变化的非周期信号它们对时钟的精度要求不是很高 因此大多数情况下硬件 FLL

10、是可以胜任的. 10. 程序清单程序清单 MSP430 的另外一个特点是用 C 语言编写程序简单而且效率较高本例就采用 C 语言编 写了程序清单如下 #include #include int SampleTimes=0; /*定义正弦表,并用 32 个抽样值初始化正弦表,不要用“0“抽样*/ int SinTable=255,254,246,234,219,199,177,153,128,103,79,57,37,22,10,2, 1,2,10,22,37,57,79,103,128,153,177,199,219,234,246,25 5; void main(void) 图 4 软件流程

11、 int i; WDTCTL = WDTPW +WDTHOLD; / 禁止看门狗定时器 /*初始化端口*/ P2DIR |= 0x0C; / P2.2 和 P2.3 为输出 P2SEL |= 0x0C; / P2.2 和 P2.3 分别为 TB1 和 TB2 /*设置系统时钟*/ FLL_CTL0 = XCAP18PF; / 设置 XTAL1 的负载电容 SCFQCTL = 50-1; / 1.6384MHz/32768Hz = 50,fDCO=MCLK=1.6384MHzfor (i = 50000; i; i-); / 晶振初始化延时 /*设置 Timer_B*/ TBCTL = TBSS

12、EL1 + TBCLR; / 选择 SMCLK 为时钟定时器清除 TBCTL|=MC_1+CNTL_0+TBCLGRP_0; /选择 up,16 位模式 TBCCTL0=CCIE; /将 CCR0 设为比较模式,中断允许 TBCCR0=256-1; /PWM 的周期为 256,也就是 DAC 为 8bit TBCCTL1=OUTMOD_7+CLLD_1; /将 CCRx 设为比较模式,中断禁止 TBCCTL2=OUTMOD_7+CLLD_1; /选择输出模式 7,当 TBR 计数到 0 时 CCRx 数据加载到 TBCTLx TBCCR1=SinTableSampleTimes; /将正弦表加载到 CCR1 TBCCR2=128; /PWM 的占空比为 50%,产生 0.5VCC 的直流电平 _EINT(); /中断允许 for (;) _BIS_SR(LPM0_bits); /CUP 进入低功耗模式 _NOP(); /调用中断函数 interrupt TIMERB0_VECTOR void Timer_B(void) SampleTimes=(SampleTimes+1)%32; TBCCR1=SinTableSampleTimes; /将新的抽样值装入 CCR1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号