历史上的今天
今天是:2025年01月29日(星期三)
2020年01月29日 | STM32之timer1产生PWM(互补通道)
2020-01-29 来源:eefocus
一、简介
本文介绍STM32系列如何使用timer1的第TIM1_CH2N通道(PB14)产生PWM。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0
编译软件:MDK4.53
硬件平台:STM32开发板(主芯片stm32f103c8t6)
仿真器:JLINK
三、版权声明
四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
1)《STM32之timer3产生PWM》:http://blog.csdn.net/feilusia/article/details/53634882
2、在进行本文步骤前,请先实现以下博文:
暂无
五、基础知识
1、什么是互补通道?
答:TIM1_CH2N通道就是TIM1_CH2的互补通道,它们的波形完全反向。有些引脚上是互补通道,我们同样可用于PWM输出。
六、实验步骤
1、编写并添加PWM驱动
1)编写驱动GUA_Timer1_PWM.c(存放在“……HARDWARE”)
//******************************************************************************
//name: GUA_Timer1_PWM.c
//introduce: 定时器1的PWM驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
#include "stm32f10x.h"
#include "GUA_Timer1_PWM.h"
/*********************宏定义************************/
//引脚宏
#define GUA_TIMER1_PWM_PORT GPIOB
#define GUA_TIMER1_PWM_PIN GPIO_Pin_14
#define GUA_TIMER1_PWM_MODE GPIO_Mode_AF_PP
#define GUA_TIMER1_PWM_GPIO_CLOCK RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO
#define GUA_TIMER1_PWM_PERIPH_CLOCK RCC_APB2Periph_TIM1
//计数值
#define GUA_TIMER1_PWM_PERIOD (72 - 1)
/*********************内部函数声明************************/
static void GUA_Timer1_PWM_IO_Init(void);
static void GUA_Timer1_PWM_Config_Init(GUA_U16 nGUA_Timer3_PWM_Prescaler);
//******************************************************************************
//name: GUA_Timer1_PWM_IO_Init
//introduce: 定时器1的PWM的IO初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
static void GUA_Timer1_PWM_IO_Init(void)
{
//IO结构体
GPIO_InitTypeDef GPIO_InitStructure;
//时钟配置
RCC_APB2PeriphClockCmd(GUA_TIMER1_PWM_GPIO_CLOCK, ENABLE);
//IO初始化
GPIO_InitStructure.GPIO_Pin = GUA_TIMER1_PWM_PIN;
GPIO_InitStructure.GPIO_Mode = GUA_TIMER1_PWM_MODE;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GUA_TIMER1_PWM_PORT, &GPIO_InitStructure);
}
//******************************************************************************
//name: GUA_Timer1_PWM_Config_Init
//introduce: 定时器1的PWM的配置初始化
//parameter: nGUA_Timer1_PWM_Prescaler:预分频数值,如100则表示1000000/100=10000Hz
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
static void GUA_Timer1_PWM_Config_Init(GUA_U16 nGUA_Timer1_PWM_Prescaler)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//时钟配置
RCC_APB2PeriphClockCmd(GUA_TIMER1_PWM_PERIPH_CLOCK, ENABLE);
//定时器配置
TIM_TimeBaseStructure.TIM_Period = GUA_TIMER1_PWM_PERIOD; //设置计数值
TIM_TimeBaseStructure.TIM_Prescaler = nGUA_Timer1_PWM_Prescaler - 1; //设置预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//PWM配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1(小于计数值时为有效电平)
//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出的互补输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //当定时器计数值小于CCR1时为低电平
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //当定时器计数值小于CCR1时互补输出为低电平
//TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //当MOE=0时,如果实现了OC*N,则死区后OC*=1
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; //当MOE=0时,如果实现了OC*N,则死区后OC*=1
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //使能通道2
//默认关闭PWM
GUA_Timer1_PWM_Status(GUA_TIMER1_PWM_STATUS_OFF);
//使能
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH2预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1重载寄存器ARR
TIM_Cmd(TIM1, ENABLE); //使能定时器1
}
//******************************************************************************
//name: GUA_Timer1_PWM_Status
//introduce: 定时器1的PWM开关
//parameter: nGUA_Timer1_PWM_Status: GUA_TIMER1_PWM_STATUS_ON or GUA_TIMER1_PWM_STATUS_OFF
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
void GUA_Timer1_PWM_Status(GUA_U8 nGUA_Timer1_PWM_Status)
{
//打开PWM
if(nGUA_Timer1_PWM_Status == GUA_TIMER1_PWM_STATUS_ON)
{
TIM_SetCounter(TIM1, 0);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
//关闭PWM
else
{
TIM_CtrlPWMOutputs(TIM1, DISABLE);
}
}
//******************************************************************************
//name: GUA_Timer1_PWM_SetDutyCycle
//introduce: 定时器1的PWM设置占空比
//parameter: nGUA_Timer1_PWM_DutyCycle: 0~100为0%~100%
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
void GUA_Timer1_PWM_SetDutyCycle(GUA_U8 nGUA_Timer1_PWM_DutyCycle)
{
TIM_SetCompare2(TIM1, GUA_TIMER1_PWM_PERIOD*nGUA_Timer1_PWM_DutyCycle/100);
}
//******************************************************************************
史海拾趣
|
集成主板通常指那些在主板上直接集成了显卡、声卡或网卡等部件的主板,其中以集成显卡为重要特征。虽然集成主板并不是主流产品,但它以较低的价格及安装的简便性还是在主板市场占有一席之地。集成主板上的显卡、声卡、网卡等部份由于 ...… 查看全部问答> |
|
最近IT业的人没有不知道iPhone 4的信号门,为此展开的口水战也屡见于各大媒体。“信号门”本不是什么好事,对于其他公司甚至可能是灭顶之灾,但苹果有个乔布斯,信号门不仅乔布斯出尽风头,出现在各大媒体头版头条,iPhone 4手机的销售也好像丝毫没 ...… 查看全部问答> |
|
高分求助:关于ws2_32.lib的很难的问题 ,————急 我修改一个实例程序:用到下面语句(在evc中) #pragma comment(lib, \"ws2_32.lib \"),但却出现下面错误。 cannot open file \'ws2_32.lib \' 我在setting->link->Object/library modules:中填上:ws2_32 ...… 查看全部问答> |
|
因为手头的开发板是mips32+linux,嵌入式设备里,想添加java游戏,应该移植哪种JVM比较好,比较快,比较容易?据说kaffe是一个不错的JVM,有没有移植过的朋友,可以参考指点的,谢谢!… 查看全部问答> |
|
请问ov7620逐行扫描模式怎样设置呀?我象7620的寄存器0x28写入0x20为什么不行(7620一直忙)呀?是不是还要写其他寄存器呀,怎样写呀?急呀? 谢谢先!… 查看全部问答> |
|
有个想法,MSP430 LaunchPad 仿真 msp430fr5739 突然用MSP430 LaunchPad 仿真 fr5739发现不能正常仿真,仿真脚是DVCC,DVSS,P2.0,P2.1,TEST,RST,管脚有错误吗?报错图片请看 另,可以串口下载的msp430f149,MSP430 LaunchPad也不能仿真。难道MSP430 LaunchPad仿真范围只 ...… 查看全部问答> |
|
目前绝大部分的rtos都是没有基于mmu或者mpu来运行的,也就是说没有内存保护机制。在没有内存保护机制的前提下,最揪人心的莫过于任务栈空间的溢出了,任务栈空间的溢出随时就像一颗定时炸弹等着引爆,使用者浑身不自在。有没有100%的任务栈空间溢出 ...… 查看全部问答> |




