博客
关于我
STM8的C语言编程(14)--+PWM
阅读量:791 次
发布时间:2023-01-23

本文共 1679 字,大约阅读时间需要 5 分钟。

在单片机应用系统中,PWM信号是一个非常重要的输出功能,广泛应用于控制电机转速、LED亮度等场景。STM8单片机的PWM模块简单易于使用,能够通过配置寄存器来设置占空比和频率。

PWM信号基础知识

PWM信号由两个关键参数决定:

  • 周期/频率:定义信号的高低电平重复次数。例如,频率为1KHZ意味着信号每秒重复1次。
  • 占空比:决定高电平占总周期的比例。例如,占空比为30%的信号在高电平状态下保持300uS,低电平保持700uS。
  • 实现PWM输出

    STM8单片机的PWM模块基于定时器的计数器和比较器原理。具体步骤如下:

  • 初始化定时器模式

    • 使用TIM_Init()函数配置定时器为PWM模式。
    • 设置TIM2_CMR2寄存器为PWM输出模式。
  • 设置自动装载寄存器

    • 通过设置TIM2_CCR2寄存器,决定PWM的频率。
    • 根据公式F_pwm = CPU时钟频率 / 256,计算合适的寄存值。
  • 初始化比较寄存器

    • 设置TIM2_CCR2寄存器值决定占空比。
  • 编程实现

    • 在主循环中,通过改变比较寄存器值,逐步调节占空比。
    • 实现占空比从0%递增到100%,再递减到0%的循环过程。
  • 代码示例

    #include "STM8S207C_S.h"void CLK_Init(void) {    CLK_CKDIVR = 0x11; // 16MHZ / 4 = 4MHZ    CLK_CPUCLK = 0x02; // CPU clock = 2MHZ}void TIM_Init(void) {    TIM2_CMR2 |= 0x70; // Configurer TIM2-chan1 en PWM mode    TIM2_CCER1 |= 0x30; // Low polarity, enable PWM    TIM2_PSCR = 0; // 1x clock divisor    TIM2_CR1 |= 0x01; // Start counter}void DelayMS(unsigned int ms) {    unsigned char i;    while (ms != 0) {        for (i = 0; i < 250; i++) {            DelayMS(5);        }        for (i = 0; i < 75; i++) {            DelayMS(5);        }        ms--;    }}void main() {    CLK_Init();    TIM_Init();    unsigned char i;    while (1) {        for (i = 0; i < 128; i++) {            TIM2_CCR2H = 0;            TIM2_CCR2L = i;            DelayMS(5);        }        for (i = 128; i > 0; i--) {            TIM2_CCR2H = 0;            TIM2_CCR2L = i;            DelayMS(5);        }    }}

    代码解析

  • CLK_Init()

    • 配置时钟分频器为1x,即计时器时钟为4MHZ。
  • TIM_Init()

    • 配置定时器2-chan1为PWM输出模式。
    • 设置自动装载寄存器和比较寄存器,启用PWM输出。
  • DelayMS()

    • 延时函数用于调节PWM波形的占空比变化时间。
  • main()

    • 在程序入口初始化时钟和定时器。
    • 进入无限循环,首先设置占空比为0%-128%。
    • 然后设置占空比从128%-0%,实现回波纹效果。
  • 测试验证

  • 连接示波器观察PWM波形。
  • 调整比较寄存器值,控制占空比。
  • 测试代码是否符合预期。
  • 通过以上步骤,可以在STM8单片机上实现简单且可靠的PWM控制功能,满足多种应用需求。

    转载地址:http://kneyk.baihongyu.com/

    你可能感兴趣的文章
    Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)
    查看>>
    Hyper-V系列:windows11开启系统自带安卓虚拟机并安装apk包
    查看>>
    Hyper-V系列:微软官方文章
    查看>>
    idea打war包的两种方式
    查看>>
    Java系列:【注释模板】IDEA中JAVA类、方法注释模板教程
    查看>>
    JS系列(仅供参考):【浏览器编程】浏览器F12调试工具面板详解和JavaScript添加断点
    查看>>
    Kali 更换源(超详细,附国内优质镜像源地址)
    查看>>
    kali安装docker(亲测有效)
    查看>>
    Linux系列:Linux目录分析:[/] + [/usr] + [/usr/local] + [/usr/local/app-name]、Linux最全环境配置 + 动态库/静态库配置
    查看>>
    Linux系列:ubuntu各版本之间的区别以及Ubuntu、kubuntu、xUbuntu、lubuntu等版本区别及界面样式
    查看>>
    mysql系列:远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
    查看>>
    Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案
    查看>>
    Nmap渗透测试指南之探索网络
    查看>>
    Nmap渗透测试指南之防火墙/IDS逃逸、信息搜集
    查看>>
    Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务、snmp服务
    查看>>
    PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
    查看>>
    PHP系列:使用PHP实现登录注册功能的完整指南
    查看>>
    Python&aconda系列:cmd/powershell/anaconda prompt提示“系统找不到指定的路径”(亲测有效)
    查看>>
    Python&aconda系列:conda踩坑记录2.UnsatisfiableError: The following specifications were found to be incompa
    查看>>