打印
[STM8]

写书计划《无刷直流电机控制应用--基于STM8》现书 特惠见P12

[复制链接]
楼主: uet_cache
手机看帖
扫描二维码
随时随地手机跟帖
121
uet_cache|  楼主 | 2013-4-12 11:21 | 只看该作者 回帖奖励 |倒序浏览
3.2.6 STM8 EMC设计注意事项
在设计电路时,应注意以下几个问题。以图3-15所示说明。
3-15电源及EMC设计
1VCAP电容
STM8SVCAP电容是一个很特别的电容。它是STM8S的内核的工作电压。需要在外部加一个外部的电容,以保证内核工作电压的稳定。一般推荐1uF的瓷片电容。而且1uF的瓷片电容在进行PCB布线时,必须要尽可能地靠近VCAP引脚,一直靠近到不能再靠近为止。这一点非常非常重要。
注意:STM8L系列上没有此电容。
2)电源
VDD和VSS电源引脚上,建议加上退耦电容(10uF点解电容和0.1uF瓷片电容)
在用电源对VDDIO_xVSSIO_x的引脚上,建议加上退耦电容(10uF点解电容和0.1uF瓷片电容)。或者至少加上一个0.1uF瓷片电容。
若在电路中,有用到外部的设备(如FLASH, 24C02等),建议在其电源上加上退耦电容(10uF点解电容和0.1uF瓷片电容)。或者至少加上一个1uF瓷片电容。最好不要使其与MCU共地。
3)地线
在开始PCB布线前,需要全局考虑GND的走向。在设计中注意电流回路,特别是MCU电流回路要与其他大电流的回路分开。不建议GND走过孔,过孔在线路中有阻抗,容易造成的GND电势不同,尽可能GND布在PCB的一面上。不建议在GND线上加跳线连接。
4)复位
对于STM8的应用,NRST复位脚,因内部有一个弱上拉电阻。在应用时可复位电路可只用一个外部的瓷片电容就(一般在100nF-0.1uF)就可以。也可按照通常的方式加一个上拉电阻(4.7K-10K)。
5SWIM调试接口
建议在SWIM引脚上,接一个上拉电阻,以保持其数据可靠稳定(4.7K-10K)。
6STM8时钟
建议采用内部的RC时钟作为主时钟。针对一些STM8S产品,使用外部时钟, MCU的抗干扰性能稍弱。又对时钟精度有特别的要求,可用外部的时钟作为一个参考时钟去校验内部的RC时钟,仍使用内部RC作为主时钟,可避免使用外部时钟抗干扰的问题。

使用特权

评论回复
122
uet_cache|  楼主 | 2013-4-14 11:27 | 只看该作者
3.3  时钟配置3.3.1 STM8S时钟树
STM8S时钟控制器功能强大而且灵活易用。其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。
用户可独立地管理各个时钟源,并将它们分配到CPU或各个外设。主时钟和CPU时钟均带有预分频器。
STM8S具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。
为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。如果不匹配,则产生一个EMC复位,从而使应用程序恢复到正常操作。
STM8S单片机的时钟树,如图3-16所示:
3-16  STM8S单片机时钟树
注意:HES: High Speed External clock signal; HSI: High Speed internal clock signal; LSI: Low Speed internal clock signal
4种时钟源可用做主时钟:1-24MHz高速外部晶体振荡器(HSE)、最大24MHz(不同的STM8微处理器,最高时钟频率限制不同)高速外部时钟信号(HSE user-ext)16MHz高速内部RC振荡器(HSI)128KHz低速内部RC(LSI)。各个时钟源可单独打开或关闭,从而优化功耗。
1HSE高速外部晶体振荡器
外部124MHz的振荡器其优点在于能够产生精确的占空比为50%的主时钟信号。硬件连接如图3-17所示。
3-17  STM8S外部晶振硬件连接图
振荡器在启动时输出时钟信号是不稳定的,默认情况下,在时钟信号被使用之前会插入2048个振荡器周期的延迟。用户可通过设置选项字节HSECNT来缩短稳定时间。
外部时钟寄存器CLK_ECKR中的标志位HSERDY用以指示高速外部振荡器是否稳定。启动时,HSE时钟信号将不会生效直至此标志位被硬件置位。
HSE晶体可通过设置外部时钟寄存器CLK_ECKR中的HSEEN位来打开或关闭。
2HES user-ext高速外部时钟信号
这种模式下,必须由用户提供一个外部时钟,此时钟的最高频率可为24MHz。用户可通过编程选项位EXTCLK选择此模式。此时,占空比约50%的外部时钟信号(方波,正弦波,三角波)用以驱动OSCIN引脚,而OSCOUT引脚可做为通用输入/输出管脚使用。硬件连接如图3-18所示。
3-18  STM8S高速外部时钟接入图
(3)HSI 高速内部RC振荡器
HSI信号由内部16MHz RC振荡器与一个可编程分频器(分频因子从18)产生。分频因子由寄存器CLK_CKDIVR决定。注意:启动时,主时钟源默认为HSI RC时钟的8分频,即fHSI/8
HSI RC可以提供一个低成本的16MHz时钟源(无需外部器件),其占空比为50%HSI启动速度比HSE晶体振荡器快,但是其精度即使经过校准也仍然比外部晶体振荡器或陶瓷谐振器低。
内部时钟寄存器CLK_ICKR中的标志位HSIRDY用以指示HSI RC是否稳定。启动时,HSI时钟信号将不会生效直至此标志位被硬件置位。
HSI RC可通过设置内部时钟寄存器CLK_ICKR中的HSIEN位打开或关闭。
4LSI 128KHZ低速内部RC
128KHzLSI RC时钟是一个低功耗,低成本的可选主时钟源,也可在停机(Halt)模式下作为维持独立看门狗和自动唤醒单元(AWU)运行的低功耗时钟源。
LSI可通过设置内部时钟寄存器CLK_ICKR中的LSIEN位打开或关闭。
内部时钟寄存器CLK_ICKR中的标志位LSIRDY用以指示LSI是否稳定。启动时,LSI时钟信号将不会生效直至此标志位被硬件置位。

使用特权

评论回复
123
cjhk| | 2013-4-14 20:13 | 只看该作者
楼主  现在书写的怎么样了   还想看看你的书籍  呵呵   顶一个  呵呵

使用特权

评论回复
124
cjhk| | 2013-4-14 20:13 | 只看该作者
希望你的书籍早点出来的   呵呵  

使用特权

评论回复
125
zhouboatsir| | 2013-4-15 17:38 | 只看该作者
   楼主好样的,本人初来乍到,自问也开发过2、3年的STM8S,STM8L,对比楼主的研究,自叹不如,等书出来了一定去买本看看。
   最近我出于兴趣爱好,准备用STM8S105K4做BLDC,但用 STM8S MC V1.0的库结合 library builder V1.0.2,没调试出来,不知道问题出在什么地方,还在摸索,不知道能否与楼主交流一下?
   对于您的书籍,个人认为对STM8S的单片机介绍与应用不易过多的篇幅,毕竟资料官方有太多的资料。我建议重点解说电机工作原理与控制原理,然后如何结合STM8S硬件与软件来驱动电机,这纯属个人观点,并不代表大众的口味。
   楼主加油吧,再次感谢楼主的无私精神,我会一直关注下去。

使用特权

评论回复
126
xylvhp| | 2013-4-16 13:31 | 只看该作者
期待楼主大作

使用特权

评论回复
127
szn1423| | 2013-4-17 06:50 | 只看该作者
现在STM8的书好像还没有用C语言写的,楼主的书能填补这个空白,先预订一本。

使用特权

评论回复
128
uet_cache|  楼主 | 2013-4-20 15:23 | 只看该作者
(谢谢各位关注。这周出差了几天,现在更上。。。)

3.3.2 时钟配置实现

为使系统快速启动,复位后时钟控制器自动使用HSI8分频(HSI/8)做为主时钟。其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。
一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。
与时钟配置相关的寄存器主要包括以下几种。
1)内部时钟寄存器(CLK_ICKR)
复位值:0x01
   7       6       5              4                  3            2           1              0
保 留
REGAH
LSIRDY
LSIEN
FHW
HSIRDY
HSIEN
                               rw            r                 rw          rw         r              rw
表3-6 内部时钟寄存器位定义
位 7:6
保留。始终为0。
位 5
REGAH:活跃停机(Active Halt) 模式下电压调节器关闭
由软件置位或清除。为1时,一旦MCU进入活跃停机(Active Halt) 模式,主电压调节器将关闭,从而唤醒时间将比较长。
0:活跃停机(Active Halt) 模式下主电压调节器处于开
1:活跃停机(Active Halt) 模式下主电压调节器处于关
位 4
LSIRDY:低速内部振荡器准备就绪
由硬件置位或清除
0:LSI时钟未准备就绪
1:LSI时钟准备就绪
位 3
LSIEN:低速内部振荡器使能
由软件置位或清除。如果LSI为必需的,则硬件将该位置1,例如:
- 当时钟源切换至LSI时(参见寄存器CLK_SWR)
- 当LSI被指定为时钟输出源(CCO)时(参见寄存器CLK_CCOR)
- 当BEEP被使能时(寄存器BEEP_CSR的位BEEPEN=1)
- 当LSI测量被使能时(寄存器AWU_CSR的位MSR=1)
当LSI被指定为主时钟源/CCO时钟源/AWU/IWDG的时钟源时,该位不能被清除。
0:关闭低速内部振荡器
1:打开低速内部振荡器
位 2
FHWU:从停机(Halt)或活跃停机(Active Halt)模式快速唤醒
由软件置位或清除
0:从停机(Halt)或活跃停机(Active Halt)模式快速唤醒禁用
1:从停机(Halt)或活跃停机(Active Halt)模式快速唤醒使能
位 1
HSIRDY:高速内部振荡器准备就绪
由硬件置位或清除
0:HSI未准备就绪
1:HSI准备就绪
位 0
HSIEN:高速内部RC振荡器使能
由软件置位或清除。如果HSI为必需的,则硬件将该位置1,例如:
- 当被CSS激活,做为安全备用振荡器
- 当时钟源切换至HSI(参见寄存器CLK_SWR)
- 当HSI被指定为时钟输出源(CCO)时(参见寄存器CLK_CCOR)
当HSI被指定为主时钟源,或CCO时钟源,或安全备份(辅助)时钟源时,该位不能被清除。
0:高速内部RC关。
1:高速内部RC开。
2)外部时钟寄存器(CLK_ECKR)
复位值:0x00
   7       6       5              4                  3            2           1              0
保 留
HSERDY
HSEEN
                                                                                                  r              rw
表3-7 外部时钟寄存器位定义
位 7:2
保留。始终为0。
位 1
HSERDY:高速外部晶体振荡器准备就绪
由硬件置位或清除。
0:HSE未准备就绪
1:HSE准备就绪
位 0
HSEEN:高速外部晶体振荡器使能
由软件置位或清除。用于打开或关闭外部晶体振荡器。下列情况下,由硬件将该位置1:
-当时钟源切换至HSE(参见寄存器CLK_SWR)
- 当HSE被指定为时钟输出源(CCO)时(参见寄存器CLK_CCOR)
当HSE被指定为主时钟源,或CCO时钟源时,该位不能被清除。
0:HSE关
1:HSE开
3)主时钟状态寄存器(CLK_CMSR)
复位值:0xE1
    7       6       5            4                  3            2           1              0
CKM[7:0]
       r             r             r             r                 r             r           r              r
表3-8 主时钟状态寄存器位定义
位 7:0
CKM[7:0]:主时钟状态位
由硬件置位或清除。用以指示当前所选的主时钟源。如果该寄存器中的值为无效值,则产生MCU复位
0xE1:HSI为主时钟源(复位值)
0xD2:LSI为主时钟源(仅当LSI_EN选项位为1时)
0xB4:HSE为主时钟源
4)主时钟切换寄存器(CLK_SWR)
复位值:0xE1
      7       6       5         4           3          2           1             0
SWI[7:0]
        rw         rw          rw          rw         rw          rw         rw            rw
表3-9 主时钟切换寄存器位定义
位 7:0
SWI[7:0]:主时钟选择位
由软件写入。用以选择主时钟源。当时钟切换正在进行(SWBSY=1)时,该寄存器的内容将被写保护。如果寄存器CLK_CSSR的位AUX=1,则该寄存器将被置位复位值(HSI)。如果选择了快速Halt唤醒模式(寄存器CLK_ICKR的位FHW=1),从停机(Halt)/ 活跃停机(Active Halt)唤醒时,该寄存器将被硬件设置为E1h(选择HSI)
0xE1:HSI为主时钟源(复位值)
0xD2:LSI为主时钟源(仅当LSI_EN选项位为1时)
0xB4:HSE为主时钟源
5)切换控制寄存器(CLK_SWCR)
复位值:未定义
   7       6       5              4                  3            2           1              0
保 留
SWIF
SWIEN
SWEN
SWBSY
                                                                  rc_w0     rw         rw            rw
表3-10 切换控制寄存器位定义
位 7:4
保留。始终为0。
位 3
SWIF:时钟切换中断标志位
由硬件置位或软件写0清除。该位的含义取决于SWEN位的状态。参见图15和图16
手动切换模式下(SWEN=0)
0:目标时钟源未准备就绪
1:目标时钟源准备就绪
自动切换模式下(SWEN=0)
0:无时钟切换事件发生
1:有时钟切换事件发生
位 2
SWIEN:时钟切换中断使能
由软件置位或清除
0:时钟切换中断禁用
1:时钟切换中断使能
位 1
SWEN:切换启动/停止
由软件置位或清除。向该位写1将切换主时钟至寄存器CLK_SWR指定的时钟源。
0:禁止时钟切换的执行
1:使能时钟切换的执行
位 0
SWBSY:切换忙
由硬件置位或清除。可由软件清除以复位时钟切换过程。
0:无时钟切换在进行。
1:时钟切换正在进行。
6)时钟分频寄存器(CLK_CKDIVR)
复位值:0x18
   7       6       5              4                  3            2           1              0
保 留
HSIDIV[1:0]
CPUDIV[2:0]
                                              rw                 rw          rw         rw            rw
表3-11 时钟分频寄存器位定义
位 7:5
保留。始终为0。
位 4:3
HSIDIV[1:0]:高速内部时钟预分频器
由软件写入,用于指定HSI分频因子。
00:fHSI = fHSI RC输出
01:fHSI = fHSI RC输出/2
10:fHSI = fHSI RC输出/4
11:fHSI = fHSI RC输出/8
位 2:0
CPUDIV[2:0]:CPU时钟预分频器
由软件写入,用于指定CPU时钟预分频因子。
000:fCPU = fMASTER
001:fCPU = fMASTER/2
010:fCPU = fMASTER/4
011:fCPU = fMASTER/8
100:fCPU = fMASTER/16
101:fCPU = fMASTER/32
110:fCPU = fMASTER/64
111:fCPU = fMASTER/128
更多时钟配置相关寄存器请详见STM8参考手册。
STM8编程时,配置时钟可通过寄存器操作完成,也可通过固件库函数完成。
当时钟配置为HSI,并且选择1分频,即主时钟频率为16MHZ时。如果通过寄存器操作完成配置,参考语句如下:
/* fCPU=fMASTER = 16MHz */
CLK->CKDIVR = 0x00;   // HSIDIV[1:0]=0x00, CPUDIV[2:0]=0x00
如果使用库函数,参考语句如下:
/* Select fCPU = 16MHz */
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
其中,CLK_PRESCALER_HSIDIV1变量及CLK_SYSCLKConfig函数均已在外设库固件库中定义好。
CLK_PRESCALER_HSIDIV1的定义在STM8S_CLK.H文件的168行,语句为:
CLK_PRESCALER_HSIDIV1 = (u8)0x00, /*!< High speed internal clock prescaler: 1 */
CLK_SYSCLKConfig函数的定义在STM8S_CLK.C文件的623行,定义为:
void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef ClockPrescaler)
{
  /* check the parameters */
  assert_param(IS_CLK_PRESCALER_OK(ClockPrescaler));
  if (((u8)ClockPrescaler & (u8)0x80) == 0x00) /* Bit7 = 0 means HSI divider */
  {
    CLK->CKDIVR &= (u8)(~CLK_CKDIVR_HSIDIV);
    CLK->CKDIVR |= (u8)((u8)ClockPrescaler & (u8)CLK_CKDIVR_HSIDIV);
  }
  else /* Bit7 = 1 means CPU divider */
  {
    CLK->CKDIVR &= (u8)(~CLK_CKDIVR_CPUDIV);
    CLK->CKDIVR |= (u8)((u8)ClockPrescaler & (u8)CLK_CKDIVR_CPUDIV);
  }
}
不难看出,固件库函数已经完成了对寄存器的操作。在FLASH空间足够大时,使用固件库编程,可大大降低产品开发难度,缩短产品开发时间,提高产品开发效率。

使用特权

评论回复
129
anther| | 2013-4-24 10:36 | 只看该作者
期待中。现在正苦于找不到关于STM8方面的书。我愿意先付钱

使用特权

评论回复
130
wfmartin28| | 2013-4-28 15:04 | 只看该作者
楼主最近一段时间没更新了??

使用特权

评论回复
131
电子好学者| | 2013-5-2 14:39 | 只看该作者
uet_cache 发表于 2013-3-31 10:52
谢谢楼上两位关心。此书估计四月底写完。目前前两部分已写好,基本不会改动。四月份重点写应用章节。

三四 ...

那个 无位置传感器无刷直流电机闭环三段式启动  编程能指导下吗? 没有思路啊  我想用stm32 做 ,指导下吧!

使用特权

评论回复
132
wqx0532| | 2013-5-2 15:43 | 只看该作者
不错,很好,一定支持

使用特权

评论回复
133
cjhk| | 2013-5-2 18:52 | 只看该作者
书写好了吗   楼主   等着看呢

使用特权

评论回复
134
generalqin| | 2013-5-2 22:09 | 只看该作者
加油!期待中!

使用特权

评论回复
135
linmao138168| | 2013-5-2 22:28 | 只看该作者
顶,支持楼主!

使用特权

评论回复
136
uet_cache|  楼主 | 2013-5-6 17:54 | 只看该作者
回131楼:
三段式闭环,主要是注意下,启动成功后才可以用PID。启动过程中,不能PID运算。

使用特权

评论回复
137
uet_cache|  楼主 | 2013-5-6 17:57 | 只看该作者
谢谢以上各位朋友关注。
这段时间太忙了。第六章、第七章及第九章的硬件刚调好。
这段时间在忙于这些硬件的调试。
其中第六章已经写完。
想这段时间抓紧时间把后续内容都写完,所以没有时间更新。
教练也要求17号考科目二。所以后续两周可能都没时间更了。
忙完这段时间,继续更。希望各位继续关注。

使用特权

评论回复
138
tianli1980| | 2013-5-6 21:48 | 只看该作者
在实践中总结出来的经验,对初学者应该有很大的帮助

使用特权

评论回复
139
spy2009| | 2013-5-6 21:59 | 只看该作者
最好直接用STM32做一版。

使用特权

评论回复
140
uet_cache|  楼主 | 2013-5-28 09:10 | 只看该作者
谢谢各位关注。
此书即将交稿。内容比较多,共计五百五十多页。这两天还需要整理下,交稿后,再把详细情况跟大家讲。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则