智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 25440|回复: 44
打印 上一主题 下一主题

[其他] 请问什么是pwm的预分频?为什么要“预”,该怎么设置预分频寄存器呢

  [复制链接]

6

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
威望
282
贡献
19
兑换币
0
注册时间
2010-2-9
在线时间
14 小时
跳转到指定楼层
1#
发表于 2010-2-9 23:25:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
谢谢了

49

主题

489

帖子

0

精华

金牌会员

董事长

Rank: 6Rank: 6

积分
2370
威望
754
贡献
1130
兑换币
0
注册时间
2009-10-30
在线时间
243 小时
2#
发表于 2010-2-10 11:26:43 | 只看该作者
个人理解就相当于二次分频一样,预分频是第一次,然后可以再分一次,提高一下精度,不分也行的。至于怎么设置,看看DG128的书就行,应该是一样的。
回复

使用道具 举报

0

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
749
QQ
威望
361
贡献
238
兑换币
0
注册时间
2009-3-20
在线时间
75 小时
3#
发表于 2010-2-10 14:39:39 | 只看该作者
从设置寄存器的角度理解:8位的寄存器,顶多能够分频1-255,(连续分频),譬如  1MHz分频至1Hz,一次寄存器设置显然不够。
回复

使用道具 举报

4

主题

74

帖子

0

精华

高级会员

Rank: 4

积分
971
威望
489
贡献
172
兑换币
59
注册时间
2009-11-27
在线时间
155 小时
4#
发表于 2010-2-23 11:07:25 | 只看该作者
专业术语,其实也很通俗易懂了,慢慢领会吧!
回复

使用道具 举报

9

主题

199

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
8268

论坛元老奖章

QQ
威望
529
贡献
7627
兑换币
0
注册时间
2010-1-10
在线时间
56 小时
5#
发表于 2010-3-17 12:41:39 | 只看该作者
5.3.2 PWM模块
MC9S12DG128B集成了8路8位独立PWM通道,通过设置相应控制寄存器可变成4个16位PWM通道,每个通道都有专用的计数器,PWM输出极性和对齐方式可选择,8个通道分成两组,共有4个时钟源控制。
PWM[2]主要是用于控制舵机的转向和电机的驱动。
1、通过将PWM0和PWM1级联,提高其控制精度来控制舵机的转向,由PWM1输出。在单片机总线频率为24MHz时,若设置级联PWM周期常数为60000,对应的PWM周期为20ms,PWM占空比常数为4500对应为1.5ms。改变占空比常数可以改变输出脉冲的宽度。同时为了提高舵机的响应速度使在弯道时能顺利过弯,将舵机的频率设置成10ms。
2、为了实现MC33886的正向和反向控制,用PWM2和PWM3级联,PWM6和PWM7级联,两路PWM级联来驱动电机。为提高电机的驱动能力对电机驱动频率进行了反复的调整。

最终PWM的初始化程序如下:
void pwm_init(void){
PWME=0x8A;
PWMCTL=0xB0;
PWMPRCLK=0x11;
PWMSCLA=0x01;
PWMSCLB=0x01;
PWMCLK=0xEA;
PWMPOL=0xFF;
PWMCAE=0xFF;
PWMCNT01=0;
PWMCNT23=0;
PWMCNT67=0;
PWMPER01=30000;
PWMPER23=1000;
PWMPER67=1000;
}
5.3.3 ATD模块
S12内部设置了2个10位/8位的A/D模块[2],可自行设置其转化精度和采样模式等。为了提高采样的分辨率,此次设计采用了15路AD输出。通过红外传感器采样到道路的信息,并经过ATD的模数转化,最终将结果存在相应的寄存器中,读取控制舵机的转向以及电机的速度。
其初始化程序如下:
void atd_init(void){
ATD0CTL2=0xC0;
ATD1CTL2=0xC0;
ATD0CTL3=0x02;
ATD1CTL3=0x02;
ATD0CTL4=0x8A;
ATD1CTL4=0x8A;
ATD0CTL5=0xB0;
ATD1CTL5=0xB0;
}
- 22 -
5.3.4 ECT模块
由于S12系列的MCU的定时器模块在HC12的标准定时器模块上增加了输入捕捉及脉冲累加器的功能,因而称为增强型定时器模块[2]。此次设计就用了脉冲累加和输入捕捉的功能,另外还有定时器中断的功能。
捕捉有传感器检测到的脉冲的个数,并通过脉冲累加器累加得到当前的速度值,40ms测试一次当前速度。
其初始化程序如下:
void ect_init(void){
MCCTL=0xCF;
MCFLG=0x80;
MCCNT=60000;
TCTL4=0x01;
TIOS_IOS0=0;
PBCTL=0x40;
PACN10=0x0000;
}
利用定时器进行中断反馈速度值,实时获得当前的速度。中断服务程序:
#pragma CODE_SEG NON_BANKED
void interrupt 26 ect_interrupt(void){
pulse=PACN10;
PACN10=0x0000;
MCFLG=0x80;
}
#pragma CODE_SEG DEFUALT
5.3.5时钟模块
为了提高系统的响应速度,使用单片机内部的锁相环[2]电路将外部晶振电路的16MHz通过设置SYNR,REFDV寄存器倍频到48MHz,总线时钟为24MHz。其初始化程序如下:
void crg_init(void){
SYNR=0x02;
REFDV=0x01;
while((CRGFLG & 0x08)==0 ){}
CLKSEL |=0x80;
}
回复

使用道具 举报

9

主题

199

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
8268

论坛元老奖章

QQ
威望
529
贡献
7627
兑换币
0
注册时间
2010-1-10
在线时间
56 小时
6#
发表于 2010-3-19 09:01:22 | 只看该作者
谢谢
回复

使用道具 举报

3

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
威望
357
贡献
50
兑换币
4
注册时间
2010-1-22
在线时间
14 小时
7#
发表于 2010-3-23 07:36:15 | 只看该作者
学习了
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
QQ
威望
244
贡献
46
兑换币
0
注册时间
2010-1-4
在线时间
7 小时
8#
发表于 2010-3-23 18:56:30 | 只看该作者
恩,很好,受益匪浅
回复

使用道具 举报

4

主题

215

帖子

0

精华

高级会员

Rank: 4

积分
622
QQ
威望
475
贡献
55
兑换币
20
注册时间
2010-3-8
在线时间
46 小时
9#
发表于 2010-3-23 21:48:17 | 只看该作者
回复

使用道具 举报

4

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
威望
253
贡献
35
兑换币
0
注册时间
2009-6-30
在线时间
44 小时
10#
发表于 2010-3-24 17:39:27 | 只看该作者
楼主的精神值得学习!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-23 11:21 , Processed in 0.068702 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表