STM8 PWM例程

发布者:EnchantedBreeze最新更新时间:2015-10-28 来源: eefocus关键字:STM8  PWM例程 手机看文章 扫描二维码
随时随地手机看文章
在单片机应用系统中,也常常会用到PWM 信号输出,例如电机转速的控制。现在很多高档的单片机

也都集成了PWM 功能模块,方便用户的应用。
    对于PWM 信号,主要涉及到两个概念,一个就是PWM 信号的周期或频率,另一个就是PWM 信号的
占空比。例如一个频率为1KHZ,占空比为30%,有效信号为1 的PWM 信号,在用示波器测量时,
就是高电平的时间为300uS,低电平的时间为700uS 的周期波形。
    在单片机中实现PWM 信号的功能模块,实际上就是带比较器的计数器模块。首先该计数器循环计数,
例如从0 到N,那么这个N 就决定了PWM 的周期,PWM 周期=(N+1)*计数器时钟的周期。在计数
器模块中一定还有一个比较器,比较器有2 个输入,一个就是计数器的当前值,另一个是可以设置的
数,这个数来自一个比较寄存器。当计数器的值小于比较寄存器的值时,输出为1(可以设置为0),
     当计数器的值大于或等于比较寄存器的值时,输出为0(也可设置为1,与前面对应)。
了解了这个基本原理后,我们就可以使用STM8 单片机中的PWM 模块了。下面的实验程序首先将定
时器2 的通道2 设置成PWM 输出方式,然后通过设置自动装载寄存器TIM2_CCR2,决定PWM 信号
的周期。在程序的主循环中,循环修改占空比,先是从0 逐渐递增到128,然后再从128 递减到0。
当把下面的程序在ST 的三合一板上运行时,可以看到发光二极管LD1 逐渐变亮,然后又逐渐变暗,
就这样循环往复。如果用示波器看,可以看到驱动LD1 的信号波形的占空比从0 变到50%,然后又从
50%变到0。
   同样还是利用ST 的开发工具,生成一个C 语言程序的框架,然后修改其中的main.c,修改后的代码
如下。
// 程序描述:用PWM 输出驱动LED
#include "STM8S207C_S.h"
void CLK_Init(void);
void TIM_Init(void);
// 函数功能:延时函数
// 输入参数:ms -- 要延时的毫秒数,这里假设CPU 的主频为2MHZ
// 输出参数:无
// 返回值:无
// 备注:无
void DelayMS(unsigned int ms)
{
unsigned char i;
while(ms != 0)
{
for(i=0;i<250;i++);
for(i=0;i<75;i++);
ms--;
}
}

// 函数功能:初始化时钟
// 输入参数:无
// 输出参数:无
// 返回值:无
// 备注:无
void CLK_Init()
{
CLK_CKDIVR = 0x11; // 10: fHSI = fHSI RC output/ 4
// = 16MHZ / 4 =4MHZ
// 001: fCPU=fMASTER/2. = 2MHZ
}
// 函数功能:初始化定时器2 的通道2,用于控制LED 的亮度
// 输入参数:无
// 输出参数:无
// 返回值:无
// 备注:无
void TIM_Init()
{
TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output mode PWM2.
// 通道2 被设置成比较输出方式
// OC2M = 111,为PWM 模式2,
// 向上计数时,若计数器小于比较值,为无效电平
// 即当计数器在0 到比较值时,输出为1,否则为0
TIM2_CCER1 = TIM2_CCER1 | 0x30;// CC polarity low,enable PWM output */
// CC2P = 1,低电平为有效电平
// CC2E = 1,开启输出引脚
//初始化自动装载寄存器,决定PWM 方波的频率,Fpwm=4000000/256=15625HZ
TIM2_ARRH = 0;
TIM2_ARRL = 0xFF;
//初始化比较寄存器,决定PWM 方波的占空比
TIM2_CCR2H = 0;
TIM2_CCR2L = 0;
// 初始化时钟分频器为1,即计数器的时钟频率为Fmaster=4MHZ
TIM2_PSCR = 0;
// 启动计数
TIM2_CR1 = TIM2_CR1 | 0x01;
}
main()
{
unsigned char i;
CLK_Init(); // 初始化时钟
TIM_Init(); // 初始化定时器
while(1) // 进入无限循环
{
// 下面的循环将占空比逐渐从0 递增到50%
for(i=0;i<128;i++)
{
TIM2_CCR2H = 0;
TIM2_CCR2L = i;
DelayMS(5);
}
// 下面的循环将占空比逐渐从50%递减到0
for(i=128;i>0;i--)
{
TIM2_CCR2H = 0;
TIM2_CCR2L = i;
DelayMS(5);
}
}
}

关键字:STM8  PWM例程 引用地址:STM8 PWM例程

上一篇:STM8S BUG的一点总结
下一篇:STM8S学习笔记之四(STM8 time1)

推荐阅读最新更新时间:2024-03-16 14:37

STM8 中断控制器(ITC)
STM8中断控制器简介 中断控制器提供如下功能: 硬件中断的管理 所有I/O引脚都具有外部中断能力,每一个端口都有独立的中断向量以及独立的标志。 外设中断能力 软件中断的管理(TRAP) 具有灵活的优先级和中断等级管理,支持可嵌套的或同级中断管理: 多达4个软件可编程的嵌套等级 最多有32个中断向量,其入口地址由硬件固定 2不可屏蔽的事件:RESET,TRAP 1个不可屏蔽的最高优先级的硬件中断(TLI) 基于如下STM8资源的中断管理: 位I1和I0位于CPU的条件代码寄存器(CCR) 软件优先级寄存器(ITC_SPRx) 复位向量地址0x00 8000位于程序空间的起始部分。对于
[单片机]
STM8单片机】---时钟配置小感悟
今天闲着没事,在博客中想总结一下之前工作时用到的STM8时钟代码,本来觉的很简单,随便写写就完事了。这一细看让我慌了一下,还是有没有搞懂的地方。经过一个下午的努力,并且在好朋友的帮助下,终于稍微理清了一些头绪,且记下来,不对了日后再做补充。 首先上STM8单片机的时钟树图片。 这个图是时钟树的上半部分截图。从图中可以清楚的看到STM8的时钟树相对比STM32还是简单了很多。时钟来源有3种,外部晶振、内部RC 16MHz、内部RC 128KHz。CPU的运行CLK来自Fmaster,可以进行128/64/32/16/8/4/2/1分频,也就是最快等于Fmaster。如果是来自内部RC的16MHz则可以首先进行一次预分频HSI
[单片机]
【<font color='red'>STM8</font>单片机】---时钟配置小感悟
STM8 IO输出之LED显示程序
系统功能 使用STM8控制8位LED,演示STM8单片机流水灯。 硬件设计 关于STM8的I/O结构及相关介绍详见Datasheet,这里仅对作部分简单介绍,下面是STM8的I/O引脚配置表: STM8 I/O 口引脚配置表 Px_DDR Px_CR1 Px_CR2 I/O 方式 引脚状态说明 0 0 0 输入 悬浮输入 0 0 1 输入 上拉输入 0 1 0 输入 中断悬浮输入 0 1 1 输入 中断上拉输入 1 0 0 输出 开漏输出 1 1 0 输出 推挽输出 1 X 1 输出 输出(最快速度为10MHZ) 虽然STM8的I/O口单独输出“1”时,可输出较大电流足已点亮一盏灯,但STM8总的I/O输出
[单片机]
<font color='red'>STM8</font> IO输出之LED显示程序
STM8开发环境搭建(STVD + COSMIC)
一、STM8开发IDE 1. STVD + COSMIC ST Visual Develop (STVD)只支持汇编开发,C语言开发需要再安装COSMIC,配套起来使用。 2. IAR IAR也可以用来开发STM8 下面介绍STVD + COSMIC的搭建方式 二、环境搭建 1. STVD下载、安装 直接从官网下载: https://www.st.com/en/development-tools/stvd-stm8.html 安装很简单,基本下一步往下点。 2. COSMIC下载、安装 对于stm8可以使用32K免费使用权限,每台电脑是1年,以及16K的限制权限,需要使用邮件获取license.lic文件。 下载
[单片机]
<font color='red'>STM8</font>开发环境搭建(STVD + COSMIC)
stm8及DS1302的一些操作
最近想看下DS1302内部RAM掉电后的状态,会是默认的全0x00么? 首先查阅网上的资料和芯片相关手册,并没有对它的介绍,DS1302是块很普通的时钟芯片,之前用别的单片机也操作过,但从来没有留意这点。决定操作下1302,看下RAM究竟是什么状态。 手头别的什么单片机都没有,就有块上次代理商留下的stm8L15X系列单片机demo板。那就用这块单片机试下吧。 首先配置系统时钟,在stm8的库文件(STM8S_StdPeriph_Lib_V2.1.0)里有相关的函数获取相关时钟状态,如下: SysClkFreq = CLK_GetClockFreq(); SysClkSource = CLK_GetSYSCLK
[单片机]
STM8的EEPROM解锁是可以重复进行的
STM8的EEPROM在复位后,要想要写入数据,必须先解锁,必然无法写入数据。解锁就是向 FLASH_DUKR 中先后写入: 第一个硬件秘钥:0xAE 第二个硬件秘钥:0x56 两个字节的数据。 此时 FLASH_IAPSR 中的 DUL 位将会变为1,表示 EEPROM 已经成功解锁,可以进行写入操作了。如果发现 DUL 位不为 1 ,是可以按顺序重复写入秘钥的,直到 DUL 位为 1 为止。 但手册上是这么说的: 中文手册: 2. 如果密钥输入错误,应用程序可以尝试重新输入这两个MASS密钥来对DATA区域进行解 锁。 4. 如果密钥输入错误,DATA EEPROM区域在下一次系统复位之前将一直
[单片机]
使用stm8单片机的“外部计数”TIMx_ETR测脉冲的软件配置问题
本人在大四工作实习期间,由于工作需要,需要使用 STM8 单片机测量一个方波脉冲的频率,一开始想要使用定时器捕获,可是需要测量的脉冲频率较高,用捕获测量不仅测量不准确,而且效率低下。于是乎想到了用外部计数TIMx_ETR功能测量! 真正的问题来了,之前从来没用过 STM8 的外部脉冲计数功能,而且网上也是在找不到如何配置外部脉冲计数模式。而公司的进度还在不断的向前赶,更蛋疼的是 STM8 的绝大多数资料手册全是英文版的,不像 STM32 单片机那样有很多中文版。这下可急坏了笔者。可还是硬着头皮连夜加班的看英文文档。 经过2天的努力煎熬,笔者终于找到了解决方法,那个兴奋啊,无以言表。接下来话不多说,赶紧向广大网友分享 STM
[单片机]
STM8-按键切换灯的亮灭
目的:熟悉按位读入语句GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin);的使用 #include stm8s.h #define ulong unsigned long void delay(ulong i) { while(i--); }//延时函数 void main(void)////////////主函数 { unsigned char flag=0; GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_De
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved