STM32学习笔记-PWM波形输出

发布者:不染尘埃最新更新时间:2018-07-01 来源: 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波形输出

上一篇:STM32采用普通的IO口来测量PWM的频率
下一篇:STM32定时器----Toggle模式实现2路pwm移相

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

stm32输出pwm波使无刷电机转起来
现阶段使用stm32,基本处于模仿阶段,用野火的教程以及程序,修改一些IO口,然后烧到自己的开发板上,实现一些功能。 第二个实验室了解pwm波这个东西,脉宽调制,调节占空比可以改变电机转速,原理可以看刘洋老师的基础视频,讲的很详细。 修改野火的pwm程序,野火用了四个通道,我只用了TIM4的第一通道,程序如下: #include pwm_output.h void pwm_value(void) { TIM4- CCR1=1300; } /* * 函数名:TIM3_GPIO_Config * 描述 :配置TIM3复用输出PWM时用到的I/O * 输入 :无 * 输出 :无 * 调用 :内部调用 */ static v
[单片机]
STM32编译环境、建立工程模板以及程序下载
1、之前写51的程序我们一般都是用的keil5软件,现在写32程序,要用到keil MDK软件,但是keil5和keil MDK不兼容,也就是说在keil5里面我们没办法写STM32F1之类的程序,而在keil MDK里面也没办法写51的程序,所以说为了让他们俩相互兼容,即我们要实现在keilMDK里面要既能够写51的程序,也能够写32的程序,我当初在网上找了好多方法都不行,最后发现一种特别简单好用的方法,就是在把keil5和keil MDK两个软件安装在同一个文件夹下面。具体步骤就是 (1)安装keil5软件(尽量不要安装在C盘),然后激活它。这里激活的时候要在注册机里选择C51。 (2)安装keil MDK软件,在安装
[单片机]
<font color='red'>STM32</font>编译环境、建立工程模板以及程序下载
STM32中断式发送特点和RS485方向控制
STM32的数据发送有两个中断标志,一个是发送数据寄存器空标志,一个是发送完毕标志。两个标志都可以引起中断. 要以中断的方式发送一个数据包,流程是这样的: 1.设置RS485的方向为发送,使能发送寄存器空中断,使能完毕进入串口中断。 2.串口中断里读取串口状态,并填充一个数据到发送数据寄存器,硬件自动清除发送数据寄存器空标志,串口数据发送开始。 3.串口发送完一个数据,发送数据寄存器变空,再进入中断,继续填充下一个数据,直到最后一个数据填充完, 使能串口 发送完毕中断。 4.最后一个数据发送完毕,再次进入中断, 清除发送数据寄存器空标志,清除发送完毕中断标志,清除这两个中断标志 的使能位,设置RS485的方向为接收.
[单片机]
STM32-通用定时器基本定时功能
1. STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6
[单片机]
MSP430 定时器输出PWM波形
硬件介绍: MSP430系列单片机的TimerA结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电表和手持式仪表的理想配置。它给开发人员提供了较多灵活的选择余地。当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM,而不需利用中断维持PWM输出。 MSP430F16x和MSP430F14x单片机内部均含有两个定时器,TA和TB;TA有三个模块,CCR0-CCR2;TB含有CCR0-CCR67个模块;其中CCR0模块不能完整的输出PWM波形(只有三种输出模式可用);TA可以输出完整的2路PWM波形;TB可以输出6路完整的PWM波形。 定时器的PWM输出有有8种模式: 输出模式0 输出模式:输出信号
[单片机]
MSP430 定时器<font color='red'>输出</font><font color='red'>PWM</font><font color='red'>波形</font>
使用变参函数实现STM32串口的简易printf功能
第一,去掉了原来使用的goto语句,因为C语言中除了错误处理之外,不建议使用goto语句; 第二,fmt和pnt的含义更加明确,它们始终指向下一个需要处理的字符和变参; 第三,整理了程序结构,使它更加清晰。 void uart_printf(USART_TypeDef *USARTx, char *fmt, ...) { char *pnt = (char *)&fmt + sizeof(fmt); int len; while (*fmt != '') { if (*fmt == '%') { if (*(fmt + 1) == 'c') { uart_send_byte(
[单片机]
STM32 串口通信识别程序
代码现象:从串口发一个数据,串口能够返回相应的值, #include stm32f10x.h #include stm32f10x_gpio.h #include stm32f10x_rcc.h #include stm32f10x_usart.h #include misc.h #include string.h #define RX_BUF_SIZE 80 volatile char RX_FLAG_END_LINE = 0; volatile char RXi; volatile char RXc; char RX_BUF = {''}; //此处我删去了vola
[单片机]
PWM电磁阀/阀驱动器
DRV101是采用脉宽调制(PWM)输出的低端功率开关。这种器件适用于驱动电动机械装置,如阀、电磁阀、继电器、制动器和定位器。用它来驱动热装置(如加热器和灯)也是理想的。PWM工作保存功率并降低热上升,从而具有较高的可靠性。另外,可调的PWM允许精确地控制传到负载的功率。 DRV101驱动器功能完备,包括PWM输出、一个内部24kHz振荡器、脉宽调制器、数字控制输入、外部延迟和占空比调节、热关闭和过/欠电流指示。其他特性包括高输出驱动(2.3A),宽电源范围(+9V~+60V)以及过热和过流保护。 图1示出DRV101的基本电路连接。其输入(引脚1)是与标准TTL电平兼容,+2.2V至+5.5V输入电压使器件输出导通,而低
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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