使用STVD和Cosmic C编译器对微控制器进行编程

发布者:TranquilDreams最新更新时间:2023-02-09 来源: elecfans关键字:STVD  Cosmic  C编译器  微控制器  编程 手机看文章 扫描二维码
随时随地手机看文章

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


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


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


  了解 PWM 信号的基础

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

pYYBAGLqMy6AHCpXAAAlnuE7YZ0999.png

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

poYBAGLqMyqADzNdAAAwYIXeBo8056.png

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

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

poYBAGLqMyaAKdsoAASFvcAnjno997.png

  由于我们使用 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

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

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

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

pYYBAGLqMx6AUo2EAAPoV7FxGeo124.png

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


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

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

poYBAGLqMxqAbR1vAAG64NW0vds762.png

  确保您已包含如上图所示的头文件。打开 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

#包括“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);

}

}

}


关键字:STVD  Cosmic  C编译器  微控制器  编程 引用地址:使用STVD和Cosmic C编译器对微控制器进行编程

上一篇:不复位MCU直接调试运行程序,让bug闻风丧胆
下一篇:【超低功耗系列三】BAM 模式和 Stop 模式的选择

推荐阅读最新更新时间:2024-11-06 18:07

用MEGA8L做的AVR单片机USBASP
最近在学习AVR单片机的过程中遇到了一个很严重的问题,就是我用的笔记本没有并口,这样就无法给单片机下载程序,没有了程序,那单片机就只是一堆废物。这时突然想起之前学习51时自己做的一个USB转串口的东西直接给STC单片机下程序,那这次我何不自己做个USB口的ASP呢?说干就干,立马查资料。首先大家先了解下什么是 ASP 。 一、usbasp 的一般性介绍: 1、下载线,是 ISP (In System Programmability: 在系统编程 )或 IAP (In Application Programing: 在应用编程 ) ,都是 在线编程 的一种方式。 这里的 usbasp 下载线,则是指 利用ATMega8L芯片,模拟
[单片机]
用MEGA8L做的AVR<font color='red'>单片机</font>USBASP
基于飞思卡尔MCU的AEC算法实现
0 引言 VoIP是在IP网络上实现音视频及传真信号传输的一门全新的集成业务数据网络技术。IP语音传输技术具有节省带宽、话费低,可方便地集成智能型开放体系结构以及多媒体业务等优势。但较之传统电话,其语音质量较差。事实上,影响因特网语音质量的因素是多方面的,关键因素之一是回声的影响。因此,要提高因特网的语音质量,就必须在语音传输过程中进行回声消除。AEC是基于自适应算法并可用于VoIP的声学回声消除技术。而用于AEC算法的实现与研究的硬件平台是以freescale公司的MCF5235为核心的开发板。MCF523x系列MCU是首个以带有增强型乘加运算单元(eMAC)的ColdFire V2内核为核心,该产品同时结合了增强型时序处理单
[应用]
基于单片机控制的智能化路灯节能装置的设计
0 引言 随着大中城市规模的不断扩大,城市市容的改善,照明路灯的数量越来越多,其用电量占城市的总用电量的比例不断增加。以往的路灯照明大多采用直接供电方式,人工送电人工关闭。这种方式有许多不足:供电系统在不同的时间电压是波动的,在用电高峰期,电压都低于额定值,在用电低谷期供电电压又高于额定值,当电压高时不但影响照明设备的使用寿命,而且耗电量也大幅增加(电源电压若增加 20% ,则耗电量增加 44% ),当低谷时,照明设备又不能正常工作;利用人工送电,增加人员开资,有时又不能及时开闭,即影响正常照明又浪费电能。因而有必要针对上述问题开发出一种使用方便又节能的装置,这种装置应有如下功能。 ( 1 )稳压控制:无论在用电高峰还是用
[单片机]
第1节:单片机到底是学什么?我的两个比喻和一个规则
从业十年,教你单片机入门基础 第1讲: 开篇第一节,我问大家一个问题,跟我学单片机到底是学什么?我的回答是像驾驶汽车一样驾驭单片机。我教给大家的是驾驶汽车的技术而不是研发汽车的技术。因此每当别人问我学51单片机,PIC,AVR,stm32哪个更加有前途,应该先学哪个再学哪个时,我的回答是既然你是学驾驶技术,那么你用桑塔纳车来学还是用宝马车来学有差别吗?差别很小的,它们只是不同的厂家而已,只要会一种其它的就触类旁通了。把学单片机当作考驾照这是我所说的第一个比喻。 学单片机最核心的是程序,程序跟单片机芯片是什么关系?我的回答是像歌曲跟MP3播放器的关系。我们写的程序就像预先录制好的歌曲,单片机芯片就是一个MP3播放器。把不同的歌曲下载
[单片机]
单片机定时器介绍
定时器是单片机系统的一个重点,但并不是难点,大家一定要完全理解并且熟练掌握定时器的应用。 1) 时钟周期 时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,我们 KST-51 单片机开发板上用的晶振是 11.0592M,那么对于我们这个单片机系统来说,时钟周期=1/11059200 秒。 2) 机器周期 我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/11
[单片机]
platform驱动模型编程总结(基于mini2440平台的LED驱动)
sysfs与platform的相关基础介绍可以参考博文【 sysfs platform总线 】。 platform模型驱动编程,需要实现platform_device(设备)与platform_driver(驱动)在platform(虚拟总线)上的注册、匹配,相互绑定,然后再做为一个普通的字符设备进行相应的应用,总之如果编写的是基于字符设备的platform驱动,在遵循并实现platform总线上驱动与设备的特定接口的情况下,最核心的还是字符设备的核心结构:cdev、 file_operations(他包含的操作函数接口)、dev_t(设备号)、设备文件(/dev)等,因为用platform机制编写的字符驱动,它的本质是字符驱动
[单片机]
platform驱动模型<font color='red'>编程</font>总结(基于mini2440平台的LED驱动)
STM8S单片机红外接收解码程序 带1602显示
这几天在网上找了很多关于红外接收解码的程序,但都不是很理想。一般都是用延时来作为0和1的数据,或者注释不是很详细的,所以自己鼓捣了一个。 本程序是采用外部中断加定时器1来实现红外解码,STM8S单片机ABCD口都可作为外部中断,使用的遥控器为市面上大多数的。 需要的朋友们可以作为参考。 制作出来的实物图如下: 效果图 单片机源程序如下: /***************可识别用户码 解码成功后显示在1602并LED闪烁一次*****************/ #include iostm8s208mb.h //主控芯片的头文件 #define u8 unsigned char #define u16 uns
[单片机]
STM8S<font color='red'>单片机</font>红外接收解码程序 带1602显示
编程逻辑控制器在机顶盒中的应用
  机顶盒市场正经历着前所未有的快速增长,预计在2002年以前每年的需求量都将以百万台的数量级增长。目前机顶盒市场依据网络类型来分有三大应用市场:卫星电视、有线电视和天线电视。除按电视信号发射系统划分外,机顶盒还可按功能不同分为低端、中端和高端。其中:低端机顶盒可将解码后的音频和视频输出到模拟电视或数字电视上;中端机顶盒加入了有限的交互性,可以实现交互式广告和节目安排程序;高端机顶盒可实现高水平的交互功能,如网页浏览和硬盘视频存贮。机顶盒市场是一个变化快,对成本异常敏感的市场。为了提供竟争对手所没有的特性,广播公司必须不断为自己的机顶盒加上新的特征并迅速推向市场。   Xilinx的大容量FPGA和CPLD器件为系统设计者提供了性能
[家用电子]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved