STM32F103单片机输出相位可调PWM波

发布者:leader4最新更新时间:2022-01-06 来源: eefocus关键字:STM32F103  单片机  可调PWM波 手机看文章 扫描二维码
随时随地手机看文章

STM32定时器功能如下

通常使用的是PWM模式,可以通过PWM功能可以生成频率和占空比可调的方波信号,有时候需要生成初始相位可调的方波,PWM功能就就不能满足要求了。可以通过输出比较模式来实现。

输出比较模式是将计数器CNT的值和捕获比较寄存器CCR的对比,当CNT值等于CCR的值时,翻转输出电平

通过捕获比较寄存器CCMR模式设置位的描述可以看出,输出比较模式只有当 CCR = CNT时,输出电平才会翻转。而PWM模式下 CNT < CCR 时输出一个电平,CNT > CCR时输出相反的电平。


通过一个示意图来看看PWM输出模式

上图中是PWM输出的示意图,可以看出CNT的值从变化范围是 0---ARR,之间,CNT的值在CCR值左边时输出一个电平,CNT值在CCR右边时,输出相反电平。这样改变CCR值就可以改变输出PWM的占空比。


下面在看看输出比较模式

输出比较模式下不关心CNT比 CCR值大还是小,只关心CNT和CCR值什么时候相等,两个值相等时,就翻转输出电平。在PWM模式下,CNT值从0增加到ARR一个周期内输出电平有两次变化,而在输出比较模式下时CNT值从0增加到ARR一个周期内输出电平只有一次变化。所以输出比较模式下,定时器输出方波的频率为PWM模式下定时器输出方波频率的一半。


下面就看看代码如何实现


// arr 自动装载值  psc 分频系数

void TIM3_CMP_Init( u16 arr, u16 psc )

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

 

    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); //使能定时器3时钟  36M 

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE ); //使能GPIOC时钟

 

    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);

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //初始化TIM3

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );

 

    //初始化TIM3 比较 模式  输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)   

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

 

    TIM_OC1Init( TIM3, &TIM_OCInitStructure );

    TIM_OC2Init( TIM3, &TIM_OCInitStructure );

    TIM_OC3Init( TIM3, &TIM_OCInitStructure );

    TIM_OC4Init( TIM3, &TIM_OCInitStructure );

 

    TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable );

    TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable );

    TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );

    TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );

 

    //使能TIM3

    TIM_Cmd( TIM3, ENABLE );

}

 

这里用的是定时器3,定时器3的4个通道全部设置为输出比较模式。


定时器初始化代码,输出比较模式设置方法和PWM模式设置方法只有模式设置这一行代码不同。


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

将输出模式由TIM_OCMode_PWM1 改为  TIM_OCMode_Toggle 就可以了。


下面看主函数代码


#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "pwm.h"

// LED0  PA8  LED1 PD2

int main( void )

{

    u16 led_pwm_val = 0;

    u8 dir = 1;

    delay_init();       //延时函数初始化

    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );

    LED_Init();

 

    LED0 = 1;

    LED1 = 1;

    delay_ms( 500 );

    LED0 = 0;

    LED1 = 0;

    //比较输出模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位

    //PWM模式:    ARR 决定输出频率  CCRx 决定输出 的高电平时长

 

    //比较翻转模式,一个周期只翻转一次,所以频率为 1/2

    TIM3_CMP_Init( 1000 - 1, 36 - 1 ); //1K

    TIM_SetCompare1( TIM3, 0 );

    TIM_SetCompare2( TIM3, 200 );

    TIM_SetCompare3( TIM3, 400 );

    TIM_SetCompare4( TIM3, 600 );

    while( 1 )

    {

        delay_ms( 200 );

        LED0 = !LED0;

    }

}


定时器3时钟为72MHz,36分频后为2MHz,自动装载值为1000-1,输出频率为 2M / 1000 = 2KHz。输出比较模式的频率要在减一半,所以输出方波信号频率为 2K / 2 = 1KHz.


下来分别设置4个通道输出的初始相位,通道1相位设置为0,通道2延迟1/5周期,通道3延迟2/5周期,通道4延迟3/5周期。

4个通道的输出频率都是1KHz,周期为1000us。

通过输出波形可以看出来,起始相位依次滞后,通道1为0起点的话,通道2滞后100us,通道3滞后200us,通道4滞后300us。


上面计算的通道2滞后1/5周期,周期为1000us,1/5周期应该为200us,实际测出来为100us,说明相位计算的理论值也要减半。


这样利用定时器输出比较模式,通过设置改变定时器CCR寄存器的值,就可以控制输出方波的起始相位了。

关键字:STM32F103  单片机  可调PWM波 引用地址:STM32F103单片机输出相位可调PWM波

上一篇:STM32输出比较模式和PWM模式 比较
下一篇:STM32F103单片机生成16路PWM波

推荐阅读最新更新时间:2024-11-10 20:20

基于STM32F103的四路PWM配置程序及个人见解
平台:STM32F103系列 内容:生成四路PWM波 1、初始化配置 void Pwmpin_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Spee
[单片机]
IAR Systems支持Atmel|Smart MCU和MPU
借助 1,400多个支持Atmel广泛的 MCU和MPU组合的示例项目,IAR Embedded Workbench可帮助开发人员将他们的Atmel设计更快地推向市场 全球微控制器(MCU)及触控技术解决方案领域的领导者Atmel®公司 (NASDAQ:ATML)以及全球领先的嵌入式系统开发工具提供商IAR Systems®今日宣布,两家公司将拓展双方的合作伙伴关系,在IAR Systems 的开发工具中添加1,400多个示例项目,用以支持Atmel完整的、世界一流的MCU和MPU(微处理器)组合。 使用Atmel AVR和Atmel | SMART MCU/MPU的设计人员现在可以借助领先的C/C++编译器和调试
[单片机]
AVR单片机三种存储器使用问题
AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EEPROM 数据存储器。 Flash 存储器为1K~128K 字节,支持并行编程和串行下载,下载寿命通常可达10,000 次。由于AVR 指令都为16 位或32 位,程序计数器对它按字进行寻址,因此FLASH 存储器按字组织的,但在程序中访问 FLASH 存储区时专用指令LPM 可分别读取指定地址的高低字节。 寄存器堆(R0~R31)、I/O 寄存器和SRAM 被统一编址。所以对寄存器和I/O 口的操作使用与访问内部SRAM 同样的指令。32 个通用寄存器被编址到最前,I/O 寄存器占用接下来的64 个地址。从0X
[单片机]
单片机定时器0的使用
本程序功能是让PA口接的等每隔0.5s闪烁一次,程序如下 include avr/io.h #include avr/interrupt.h #define F_CPU 8000000UL int k; int main(void) { DDRA=0XFF; PORTA=0xff; TCCR0=0X05; TCNT0=256-F_CPU/1024*0.5; TIMSK=0X01; sei(); while(1); } ISR(TIMER0_OVF_vect) { k++; if(k 200) { k=0; PORTA=~PORTA; } TCNT0=256-F_CPU/102
[单片机]
单片机】第2章:DIY最小化系统
一、元件布放 有:PCB、洞洞板、面包板 目前流行的PCB设计软件:Altium Designer 和PowerPCB 面包板 :上下红蓝细线,两旁有+-符号。表明细线位置横向孔是相通的,且每一个纵列都用数字表示。 每个纵列中,A~E是导通的,F~J也是导通的,之间有凹槽隔开。 单片机下载方式:ISP下载(通过串行口COM作为下载接口) 没有串口则用USB接口模拟串口。转换芯片:CH340G和PL2303HX等。 ISP下载电路: USB转换电路 开机检测P3.0/RXD是否有下载命令流,有则执行,无则运行用户程序 最小系统电路图 使用ISP下载程序时,单片机需要断电冷启动
[单片机]
【<font color='red'>单片机</font>】第2章:DIY最小化系统
stm32f103串口1串口2收发程序
#include stm32f10x.h #include string.h #include stdio.h void delay(void); void GPIO_Configuration(void); void uart_init(); extern void USART_OUT(USART_TypeDef* USARTx, uint16_t *Data,...); void RCC_Configuration(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA| RCC_AP
[单片机]
找回失去的青春,单片机是玩出来的
你以为我要说离开IT业?常被人说成 IT刁丝 , IT民工 ,我却不以为然。不仅如此,我为做IT而骄傲。看看我们身边的产品,无不与IT有着密切的关系。你说你平时不用电脑。OK,你平时可以不用手机么?你知道手机是 IT刁丝 搞出来的么?再退一步,你说你也不用手机。OK,超市你去不?收银员用的收银机是 IT刁丝 搞出来的。你说你是搞金融的,不是碰IT,错,金融业的后台服务器,同样是 IT刁丝 搞出来的。 言归正传,我说的 青春 ,是我在大学错过的一段的经历,就是 玩 单片机。注意我用的文字 玩 。下次不要说你在 学习 单片机,要说玩单片机。单片机,其实我8年的手机行业工作经历一直都在用,可是手机芯片的单片机,太复杂。学的费劲,玩不起来。
[单片机]
找回失去的青春,<font color='red'>单片机</font>是玩出来的
TCP/IP协议在VRS51单片机上的实现
引言   随着人们对信息化程度的要求不断提高, 设备上网已经成为一个趋势。32位机资源丰富,上网方案也较为成熟,但成本相对较高,因而价位偏低的8位机上网方案成为研究的热点。但是,8位机资源有限,因此在实现8位机以太网连接时,一定要考虑周全。本文介绍在VRS51L3074上实现TCP/IP协议栈uIP的移植,成功实现了socket通信。 硬件平台   本方案的硬件平台主要由VRS51L3074和CS8900A组成,经网络变压器的隔离,CS8900A与网络接口RJ-45连接上,这样整个系统就可以连接到Ethernet。数据输入可由串口传递给系统。 VRS51L3074简介   VRS51L3074是Ramtron公司最新推出
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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