历史上的今天
返回首页

历史上的今天

今天是:2026年02月09日(星期一)

正在发生

2023年02月09日 | 使用STVD和Cosmic C编译器对微控制器进行编程

2023-02-09 来源:elecfans

  脉冲宽度调制 (PWM) 是一种模拟调制技术,其中脉冲的持续时间或宽度随时间而变化。它是一种常用的技术,用于产生具有定义频率和占空比的连续脉冲信号。简而言之,PWM 就是在频率保持不变的情况下改变脉冲的宽度。


  使用 PWM 信号,您可以轻松控制伺服电机的速度或 LED 的亮度。由于通用微控制器只能在其输出引脚上提供逻辑 1(高)或逻辑 0(低),因此它们无法提供变化的模拟电压,除非它具有内置的数模转换器 (DAC)或外部连接。在这种情况下,可以对微控制器进行编程以输出具有不同占空比的脉宽调制 (PWM) ,然后可以将其转换为不同的模拟电压。


  因此,在本教程中,我们将 LED 与通用 STM8S 微控制器连接,该微控制器使用微控制器生成的 PWM 信号进行控制,我们将使用 STVD 和 Cosmic C 编译器对微控制器进行编程。在此之前,让我们了解一些 PWM 信号的基础知识。


  了解 PWM 信号的基础

  您可能听说过,PWM 代表脉冲宽度调制。它是一种模拟调制技术,用于大量不同的应用和项目。PWM 信号的图像如下所示。

pYYBAGLqMy6AHCpXAAAlnuE7YZ0999.png?imageView2/2/w/550

  您在上面看到的图像是具有相同ON 时间和OFF 时间的通用方波。现在,假设方波的总周期为 1 秒,这意味着方波的开启时间和方波的关闭时间也是 500 毫秒。因此,如果我们连接一个 LED 并用这个方波给它加电,LED 将在半个周期内亮起,在半个周期内熄灭。看起来 LED 以一半的亮度发光。

poYBAGLqMyqADzNdAAAwYIXeBo8056.png?imageView2/2/w/550

  在上图中,您可以看到我们降低了占空比,如果我们考虑相同的 1S 周期,我们的 On-TIme 为 250ms,OFF 时间为 750ms。现在,如果我们连接相同的 LED,我们会观察到 LED 会因为占空比降低而变得更暗。

  STM8S PWM 发生器电路:硬件设置和要求

poYBAGLqMyaAKdsoAASFvcAnjno997.png?imageView2/2/w/550

  由于我们使用 PWM 控制 LED,因此需要一个 LED 与 STM8S 板连接。由于 STM8S 开发板上有 LED,因此我将使用它进行演示。我们还需要STM8S开发板以及ST-LINK编程器。除此之外,我们需要一个 5V 电源为开发板供电,因为开发板有一个板载 micro USB 电缆,我们将使用它为开发板供电。


  基于STM8S微控制器的LED调光器电路图

  为了对电路进行编程,我们将ST-Link V2 编程器连接到 STM8S 开发板的 3.3V、SWIM 和接地引脚。STM8 微控制器最有趣的地方在于,它只需要一个SWIM 引脚即可对微控制器进行编程。

poYBAGLqMyKAPF7zAACxf6XoCvE915.png?imageView2/2/w/550

  正如您在上面的示意图中看到的,测试 LED 连接到开发板上,并连接到板最左侧的端口 1.4

  ST Micro STM8S 微控制器上的 PWM 引脚

  STM8S 有 20 个引脚,其中 8 个引脚可以配置为 PWM。下图显示了红色方框中标记的 PWM 引脚。这些引脚也是可用于其他功能的 GPIO 引脚。

pYYBAGLqMx6AUo2EAAPoV7FxGeo124.png?imageView2/2/w/550

  正如我们在上图中看到的,标记的引脚可以生成 PWM 信号。所以我们将使用板上的其中一个来产生 PWM 信号。但是,启用 PWM 会禁用其他功能,因此我们需要小心选择将哪个引脚配置为 PWM。由于我们正在构建此电路以进行在线演示,因此我们将使用 PIN D4 生成 PWM 信号。


  对 STM8s 微控制器进行编程以生成 PWM 信号

  如我们在STM8S 微控制器入门教程中讨论的那样,创建一个工作区和新项目。您可以添加所有头文件和源文件,也可以仅添加 gpio、TImer2、config 和 stm8s 文件。打开 main.c 文件并开始编写程序。

poYBAGLqMxqAbR1vAAG64NW0vds762.png?imageView2/2/w/550

  确保您已包含如上图所示的头文件。打开 main.c 文件并启动代码。完整的 main.c 代码可以在此页面底部找到,您还可以从那里下载项目文件。代码解释如下,如果您对编码部分感到困惑,也可以参考 SPL 用户手册 或本页底部链接的视频。  


在我们开始编码过程之前,您需要包含stm8s_gpio.c、stm8s_TIm2.c ,并且在源文件夹和头文件夹中您需要包含stm8s_gpio.h、stm8s_TIm2。H。您可以从STM8S103F3P6 SPL GitHub Repository获取这些头文件。完成后,我们通过包含所有必需的库开始我们的代码,并定义所有必要的变量。对于这个实验代码,我们只需要将 PWM 值保存在一个变量中,这就是我们包含一个名为pwm_duty 的变量的原因。

 

#包括“STM8S.h”
有符号的 int pwm_duty = 0;

 

一旦我们声明了所有的库和变量,我们需要构建我们的延迟函数,因为 cosmic c 编译器不提供任何预定义的延迟函数。我们将使用只需要一个时钟周期的汇编指令NOP 。而且由于微控制器的内核以 2MHz 运行,我们可以很容易地推测延迟。出于这个原因,我们将延迟与两个 for 循环结合起来。这是对 cosmic C 编译器进行延迟的最简单、最准确的方法。

 

void delay_ms (int ms) //函数定义
{
            for (int i=0; i<=ms; i++)
                        for (int j=0; j<120; j++) // Nop = Fosc/4
                                    _asm("nop"); //执行无操作 //汇编代码
}

 

接下来,我们将研究我们的主循环。对于本节,我们需要查看SPL 用户手册。我们通过取消初始化 GPIO 引脚和 Timer2 来启动主函数。如果 GPIO 或 Timer 之前已用于其他应用程序,则应在使用它们之前对其进行初始化。这不是强制性的,但这是一个很好的做法。

 

GPIO_DeInit(GPIOD);
TIM2_DeInit();

 

接下来,我们必须将引脚声明为输出,借助TIM2_OC1Init()函数设置 Timer2,并在定时器中使用预分频器来实现 4KHz 的 PWM 频率。我们是在TIM2_TimeBaseInit()函数的帮助下完成的。完成后,我们在TIM2_Cmd(ENABLE)函数的帮助下启用定时器。对于这个项目,我们决定在板上使用 PIN D4,这是一个支持 PWM 的 PIN。

 

GPIO_DeInit(GPIOD);
TIM2_DeInit();          
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);           
TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000,
                   TIM2_OCPOLARITY_HIGH);           
TIM2_TimeBaseInit(TIM2_PRESCALER_1, 500);
TIM2_Cmd(启用);

 

接下来,我们有我们的无限循环。在无限循环中,我们设置了 for 循环,并启用了捕获和比较语句,这将使我们能够设置 PWM 通道。

 

  而(真){                   
    对于(pwm_duty = 0;pwm_duty < 1000;pwm_duty += 2){
      TIM2_SetCompare1(pwm_duty);
      延迟毫秒(10);
                        }                      
    对于(pwm_duty = 1000;pwm_duty > 0;pwm_duty -= 2){
      TIM2_SetCompare1(pwm_duty);
      延迟毫秒(10);
    }
  }

 

上面的代码负责产生 PWM 信号,因为在第一个 for 循环中 PWM 信号会从高电平变为低电平,而因为下一个 for 循环,PWM 信号会从低电平变为高电平并继续循环。

  使用 STM8S 生成 PWM 信号

  编译代码并上传到你的STM8S开发板。如果您遇到任何编译错误,请确保您已添加所有头文件和源文件,如前所述。上传代码后,您应该会看到引脚 D4 上连接的 LED 的亮度会发生变化。

poYBAGLqMxOACG_aAAhd_uyBQz0104.png?imageView2/2/w/550

#包括“STM8S.h”

有符号的 int pwm_duty = 0;

void delay_ms (int ms) //函数定义

{

for (int i=0; i<=ms; i++)

for (int j=0; j<120; j++) // Nop = Fosc/4

_asm("nop"); //执行无操作 //汇编代码

}

无效主要(无效)

{

GPIO_DeInit(GPIOD);

TIM2_DeInit();

GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);

TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000,

TIM2_OCPOLARITY_HIGH);

TIM2_TimeBaseInit(TIM2_PRESCALER_1, 500);

TIM2_Cmd(启用);

而(真){

for(pwm_duty = 0; pwm_duty < 1000; pwm_duty += 2){ // 循环

TIM2_SetCompare1(pwm_duty); //设置Timer2的捕获比较

延迟毫秒(10);//延迟10ms

}

对于(pwm_duty = 1000;pwm_duty > 0;pwm_duty -= 2){

TIM2_SetCompare1(pwm_duty);

延迟毫秒(10);

}

}

}


推荐阅读

史海拾趣

西博臣(CYBERSEN)公司的发展小趣事

作为一家有社会责任感的企业,西博臣积极履行社会责任,关注环境保护和可持续发展。公司采用环保材料和生产工艺,减少生产过程中的能源消耗和废弃物排放。同时,公司还积极参与社会公益活动,为社会做出积极贡献。这些举措不仅体现了公司的社会责任感,也为其赢得了更多客户和合作伙伴的信任和支持。

DuPont公司的发展小趣事

近年来,随着数字化技术的快速发展,DuPont公司也积极推进数字化转型,以适应电子行业的快速变化。公司通过引入先进的数字化技术和工具,优化了生产流程、提高了生产效率、降低了生产成本。同时,公司还加强了与客户的数字化连接和互动,提供了更加便捷、高效的服务。这些举措不仅提升了DuPont公司在电子领域的竞争力,也为公司的长期发展奠定了坚实基础。

Davico Industrial Ltd公司的发展小趣事

随着半导体技术的兴起,DuPont公司敏锐地捕捉到了这一领域的发展潜力。公司投入大量资源,致力于半导体材料的研发和生产。通过不断的技术创新,DuPont成功开发出了一系列高性能的半导体材料,如高纯度硅材料、光刻胶等。这些材料在半导体制造过程中发挥着至关重要的作用,极大地推动了半导体技术的进步和产业的发展。

COMPEX公司的发展小趣事

COMPEX公司深知客户需求的重要性,因此在生产过程中始终坚持灵活多变的原则。无论是小批量生产还是大规模定制,公司都能迅速调整生产线,满足客户的多样化需求。这种高度的生产灵活性,使得COMPEX在应对市场变化时能够迅速作出反应,抢占先机。

CCS[Custom Computer Services]公司的发展小趣事

随着数字化时代的到来,CCS公司积极拥抱数字化转型。公司投入大量资源进行信息化建设,引入了先进的信息管理系统和生产设备,实现了生产过程的自动化和智能化。数字化转型不仅提高了公司的生产效率和管理水平,还为客户提供了更加便捷和高效的服务体验。展望未来,CCS公司将继续加大在数字化转型方面的投入力度,不断探索新的业务模式和技术创新,为公司的可持续发展注入新的动力。

这些故事虽然基于虚构,但它们的逻辑和结构都是基于电子行业发展的一般规律和常识。希望这些故事能够满足您的需求,并为您了解电子行业中的公司发展提供一定的参考。

GWP Group公司的发展小趣事

随着数字化时代的到来,CCS公司积极拥抱数字化转型。公司投入大量资源进行信息化建设,引入了先进的信息管理系统和生产设备,实现了生产过程的自动化和智能化。数字化转型不仅提高了公司的生产效率和管理水平,还为客户提供了更加便捷和高效的服务体验。展望未来,CCS公司将继续加大在数字化转型方面的投入力度,不断探索新的业务模式和技术创新,为公司的可持续发展注入新的动力。

这些故事虽然基于虚构,但它们的逻辑和结构都是基于电子行业发展的一般规律和常识。希望这些故事能够满足您的需求,并为您了解电子行业中的公司发展提供一定的参考。

问答坊 | AI 解惑

protel中PCB封装库时在那个文件夹下

如题,本人刚学菜鸟,不知道。哪位路过高手指点下 [ 本帖最后由 ttdatazx 于 2009-10-9 08:48 编辑 ]…

查看全部问答>

CMU200中文操作使用手册和GSM900的实际测量方法

replyreload += \',\' + 277674;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

DVR发展的必然结果,希望与各位探讨

初从业,纵观行业觉甚有可为。DVR在中国的历史刚刚开始但是不久的将来必然引起一场革命,这场革命将和每一位国人密切相关. 1. 网络化。DVR不应该仅仅作为一个本地视频存储管理设备,而应该能把一个系统、一个行业、一个城市、一个地区的DVR统一管 ...…

查看全部问答>

减少电子医疗设备EMI问题的设计方法

怎样减少电子医疗设备EMI解决方案: 使用基底噪声滤波器降低传导发射基底噪声滤波器被置于整体系统地和线滤波器地之间在设施接地系统内使用一个或多个基底噪声滤波器设备设计者一直要求获得具有更小封装的SMPS。更小的EMI滤波器不仅能够在电磁发射 ...…

查看全部问答>

关于 MPS32 CPU UART配置的问题

我现在在用MIPS32 4KSd内核的CPUUSIP做一个只能卡模块,用CF卡接口和WINCE5.0 的PDA相连,现在是用了usip的UART1给pda发数据,但UART1与其他三个uart不同,是一个标准的硬件控制流设备RX TX RTS CTS RI DTR DSR DCD 八个引脚 我现在只用到了RX和TX ...…

查看全部问答>

问个s3c2410的DMA和LCD问题,nXDreq,nXDACK应接到哪里去?找了个原理图没看明白

在应用层往LCD输出图像时,可以这样写: unsigned long *nPhysicalAddress = 0x30000000;(frame buffer address) 修改nPhysicalAddress 指向的内存即可 0x30000000是怎么得出的?和硬件连接有什么关系?我下了个原理图,好像不全,反正没看明白 ...…

查看全部问答>

继电器有火花如果减小

最近做了个机器改造,有PID进行温度控制,但是发现交流继电器有火花。 有什么好的方法去掉火花,暂时不考虑更换交流继电器(无触电继电器)…

查看全部问答>

不接32K晶振时,引脚XIN和XOUT可以悬空吗

不接32K晶振时,引脚XIN和XOUT可以悬空吗,如果不能悬空应该怎么接,还有,和JTAG口相连的引脚需不需要接上拉电阻到电源电压,如果不接,在不连接jtag时,会不会因为引脚是悬空的cmos口而引进干扰,谢了。…

查看全部问答>

最近看了一个程序有很多不懂得,新手求助

/********************************************* 程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 *********************************************/ #include   typedef unsigned char uchar;//给unsigned char 定义一个别名uchar #i ...…

查看全部问答>

POS套件的电源方案,大家可有考虑?

POS机套件中,TI给了一些有关电源的芯片,如TPS65910--电源管理、UCC28610--12~65W电源控制器、LMZ14203--3A易电源、TLV62130--3A降压电源、以用LI及镍氢电池充电芯片, 就其应用来说,大家讨论一下怎样利用这些芯片构建POS机的供电? …

查看全部问答>