STM32学习笔记-PWM波形输出

发布者:沈阳阿荣最新更新时间:2021-08-27 来源: eefocus关键字:STM32  PWM  波形输出 手机看文章 扫描二维码
随时随地手机看文章

调试芯片:STM32F103C8T6


外部晶振:8MHz


功能介绍:使用Timer3实现两路(可四路)PWM波形的输出


代码如下:


初始化:系统时钟初始化,GPIO端口初始化,Timer初始化


系统时钟初始化:


/* 配置系统时钟为72M */ 

SystemInit(); 


GPIO端口初始化:


/****************************************************************

 * 函数名:void GPIO_Config(void) 

 * 描述  :配置复用输出PWM时用到的I/O 

 * 输入  :无 

 * 输出  :无 

 * 调用  :main()调用 

 ***************************************************************/ 

void GPIO_Config(void)  

  GPIO_InitTypeDef GPIO_InitStructure; 

 

  /* GPIOA and GPIOB clock enable */ 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

 

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ 

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7; 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

  GPIO_Init(GPIOA, &GPIO_InitStructure); 


Timer初始化:


/**************************************************************** 

 * 函数名:void TIM3_Config(void)  

 * 描述  :配置TIM3输出的PWM信号的模式 

 *      CH1:输出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.6的PWM波(高电平在前,低电平在后) 

 *      CH2:输出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.4的PWM波(高电平在后,低电平在前) 

 *      步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler  

 *          T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms  

 *          因为 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2 

 *          所以 TIM_Period=59999=0xEA5F 

 *      步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和TIM_OCPolarity 

 *          CH1:因为D=0.6,先高后低; 

 *              所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High 

 *          CH2:因为D=0.4,先高后低; 

 *              所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low 

 *      步骤三:基础寄存器初始化 

 *      步骤四:通道寄存器初始化 

 *      步骤五:使能TIM3重载寄存器ARR 

 *      步骤六:使能TIM3  

 * 输入  :无  

 * 输出  :无  

 * 调用  :main()调用  

 ***************************************************************/  

void TIM3_Config(void)  

{  

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

    TIM_OCInitTypeDef  TIM_OCInitStructure;  

    /* PWM信号电平跳变值 */  

    u16 CCR1= 36000;          

    u16 CCR2= 36000;  

    /*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  

    /* Time base configuration */                                            

    TIM_TimeBaseStructure.TIM_Period =0xEA5F;  

    TIM_TimeBaseStructure.TIM_Prescaler = 2;                                    //设置预分频:预分频=2,即为72/3=24MHz  

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //设置时钟分频系数:不分频  

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数溢出模式  

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  

    /* PWM1 Mode configuration: Channel1 */  

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置为PWM模式1  

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                

    TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //设置跳变值,当计数器计数到这个值时,电平发生跳变  

    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器计数值小于CCR1时为高电平  

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //使能通道1      

    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  

    /* PWM1 Mode configuration: Channel2 */  

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  

    TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //设置通道2的电平跳变值,输出另外一个占空比的PWM  

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                    //当定时器计数值小于CCR2时为低电平 

    TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                    //使能通道2  

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  

    TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能TIM3重载寄存器ARR  

    /* TIM3 enable counter */  

    TIM_Cmd(TIM3, ENABLE);                                                      //使能TIM3   



主函数代码:

/*************************************************************** 

 * 函数名:main 

 * 描述  :主函数 

 * 输入  :无 

 * 输出  :无 

 ***************************************************************/ 

int main(void) 

    SystemInit(); 

    GPIO_Config(); 

    TIM3_Config(); 

    while (1) 

    { 

     

    } 


最后上结果图:

关键字:STM32  PWM  波形输出 引用地址:STM32学习笔记-PWM波形输出

上一篇:STM32F103和STM32F401的ADC多通道采集DMA输出
下一篇:STM32F401的PWM输出

推荐阅读最新更新时间:2024-11-04 21:45

STM32—USART
前言: 最近在调试STM32L152芯片的USART配置程序,实现STM32串口打印功能,本文总结下STM32L152芯片USART的使用方法。 硬件平台:STM32L152 软件平台:keil v5+cubeMX 函数库:HAL库 1:usart初始化 UART_HandleTypeDef huart3; uint8_t rxbuf; void MX_USART3_UART_Init(void) { huart3.Instance = USART3; huart3.Init.BaudRate = 115200; huart3.Init.WordLength = UART_WORDLENGTH_8B;
[单片机]
stm32之IO操作(基于库函数)
// stm32学习笔记 对于stm32f10x系列芯片的库函数,GPIO的操作函数在stm32f10x_gpio.h中声明,在stm32f10x_gpio.c 中完成定义。 基于库函数的stm32的IO口操作步骤: 1.使能IO口时钟, 函数接口: void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 参数列表: RCC_APB2Periph:连接在APB2总线上的外设名称,如下图所示,GPIO位于APB2总线上,所以调用RCC_APB2PeriphClockCmd进行时钟使能; NewState:ENANLE或者DISAB
[单片机]
STM32学习中关于C语言基础知识点
C语言是单片机开发中的必备基础知识,这里就列举部分STM32学习中会遇见的C 语言基础知识点。 01 位操作 下面我们先讲解几种位操作符,然后讲解位操作使用技巧。C语言支持如下6中位操作: 73bb030a-c64a-11ed-bfe3-dac502259ad0.png 六种位操作 下面我们想着重讲解位操作在单片机开发中的一些实用技巧。 1. 1 在不改变其他位的值的状况下,对某几个位进行设值。 这个场景在单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作,然后用 | 操作符设值。 比如我要改变GPIOA的状态,可以先对寄存器的值进行&清零操作: 73c9f4c8-c64a-1
[单片机]
STM32之霍尔传感器模块
一、简介 本文介绍如何在STM32上使用霍尔传感器模块。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 1、在进行本文步骤前,请先阅读以下博文: 暂无 2、在进行本文步骤前,请先实现以下博文: 暂无 五、基础知识 1、霍尔传感器是什么? 答:霍尔传感器是根据霍尔效应制作的一种磁场传感器。 用磁铁去靠近霍尔传感器时,霍尔传感器的引脚电平会产生变化。 2、霍尔传感器主要用在什么地方? 答:霍尔传感器可测
[单片机]
<font color='red'>STM32</font>之霍尔传感器模块
STM32在调试过程中常见问题和解决办法
STM32微控制器系列--常见问题 St意法半导体http://www.y-ec.com (1) 已经发表的有关STM32的技术资料有哪些? (2) STM32的数据手册和技术参考手册有什么分别? (3) STM32有几种封装形式?是否符合RoHS的要求? (4) 有哪些开发工具可以用于STM32的开发? (5) 是否有简易的方法下载程序代码到STM32的内部Flash? (6) 哪里有STM32上各种外设的使用例程和编程资料? STM32微控制器系列--常见问题解答 (1) 已经发表的有关STM32的技术资料有哪些? 已经发表的有关STM32的技术资料有以下一些: STM32F103xx增强型系
[单片机]
STM32高级开发(1)-开源是什么
开源的历史及简介 在上个世纪计算机发展的早期阶段,软件几乎都是开放的,任何人使用软件的同时都可以查看软件的源代码,或者根据自己的需要去修改它。在程序员的社团中大家互相分享软件,共同提高知识水平。这种自由的风气给大家带来了欢乐,也带来了进步。 但不久之后,以微软为主的一些商业公司就破坏了这种风气。这些商业公司从自由的计算机社团里雇佣了大量的技术高手,开发带有知识产权保护的专有软件。他们在分发软件的时候也不再附带源代码。从此,专有软件的时代到来了。直到现在,专有软件不公开源代码仍是默认的行业潜规则。 即使这样,崇尚自由的斗士们也没有妥协。他们认为,数字时代本应是自由的,任何人都可以自由的获取软件资源及其源代码,而不应该被少数
[单片机]
<font color='red'>STM32</font>高级开发(1)-开源是什么
STM32开发板JLINK调试步骤
STM32调试步骤 调试前,首先跳线J9的2-3脚短接,跳线J4的右边两个脚短接,跳线J5短接,J8短接,J2的1-2短接,3-4短接。 将Jlink与学习板,USB延长线与学习板,串口延长线与学习板(或者USB转串口线与学习板)连接起来, 这时LED灯LED5,LED6都应该点亮,如果不亮,说明板子有问题。 打开串口助手,按照如下设置: 1、从桌面打开J-Flash ARM V4.02如图所示。 也可以按照如下顺序打开J-Flash ARM 。 “开始à程序àSEGGERàJ-Link ARM V4.02àJ-Flash ARM”,如下图所示。 2、打开J-Flash ARM后,先进行芯片选项设置,打开Optio
[单片机]
STM32学前班教程之六:这些代码大家都用得到
注:下面是一些常用的代码,网上很多但是大多注释不全。高手看没问题,对于我们这些新手就费劲了 所以我把这些代码集中,进行了逐句注释,希望对新手们有价值。 阅读flash: 芯片内部存储器flash操作函数 我的理解 对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。 基础应用1,FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0 24MHz时,取Latency=0;24 48MHz时,取Latency=1;48~72MHz时,取Latency=2。所有程序中必须的 用法:FLASH_SetLatency(FLASH_Latency_2); 位
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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