使用的是STM32F103RC
问题:PWM占空比的计算结果是对的但是输出出现错误,对于新西达的电机没法解锁,原因是没理解寄存器的作用。
#include "tim2_pwm.h"
#include "stm32f10x_tim.h"
void Init_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);
//OC1_PBA0 OC2_PBA1 OC3_PBA2 OC4_PBA3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Init_TIMER2(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_BaseInitStructure.TIM_Period = 3000-1;//自动冲装载寄存器
TIM_BaseInitStructure.TIM_Prescaler = 72-1;//输出比较寄存器
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void Init_PWM(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//OC1
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
//OC2
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
//OC3
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
//OC4
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_CtrlPWMOutputs(TIM2,ENABLE);
}
///////////////////////////////////////
////////////////////////////////////////
void pwm(void)
{
Init_TIMER2();
Init_GPIO();
Init_PWM();
}
empty
在代码片中的第20行的TIM_Period寄存器为自动重装载寄存器TIM_ARR的值,当计数器的值等于此值时定时器重新开始计数
在代码片中的第21行的TIM_Prescaler寄存器为预分频寄存器TIMx_PSC的值,是对于输入定时器的时钟进行分频
这两行的设置结果是PWM的输出频率为Fout=72000000/72/3000Hz;即输出的周期为3000us即3ms;
对于库函数:
TIM_SetCompare1(TIM2,999);
该函数中的999指的是高点平持续的计数数,其与TIM_Period寄存器的比值即为占空比。
则上述设置的高电平的持续时间为:1000*1us=1ms,满足新西达电机的解锁条件。
关键字:STM32 PWM波
引用地址:
STM32的PWM波产生的问题总结
推荐阅读最新更新时间:2024-03-16 16:07
STM32基于固件库学习笔记(9)TM3产生PWM调LED亮度
PWM 脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号,也就是说对脉冲宽度的控制。 STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出! 在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存OCxPE
[单片机]
新建基于MDK的STM32工程模板
一。开发环境和固定库版本 二。准备工作 三。建立工程模板 1. 建立一个Template的文件夹 2.在Template文件夹下建立下面3个文件夹 CORE 用来存放核心文件和启动文件, OBJ 是用来存放编译过程文件以及 hex 文件, STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括 system_stm32f10x.c 等等。 3. 在STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,将目录下
[单片机]
STM32实验一:GPIO之流水灯
前面写过一篇关于STM32单片机的GPIO的文章,本来是打着从实用角度来做的实验,但是发现不积跬步无以至千里啊,咱们从头开始,先做一个最简单的,入门级的,单片机系统中的hello world,流水灯实验! 我手中有一个神舟3的开发板,我就用这个板子来做实验,板子中的实验一共用到4个LED灯来做流水灯的实验,这里我们也用这4个灯,他们分别是GPIOF中的6、7、8、9这4个。 1、首先我们复制我们之前做过的模板工程到一个新建文件夹中,(如,你可以取个名字叫流水灯实验的文件夹)神舟开发板的例程中在项目中添加了两个文件,分别是led.c和led.h,这是一种习惯,每做一个项目的时候都在其中添加一个.c和对应的.h文件,这样可以是
[单片机]
STM32--低功耗模式
STM32F10xxx有三中低功耗模式: ●睡眠模式(Cortex?-M3内核停止,外设仍在运行) ●停止模式(所有的时钟都以停止) ●待机模式(1.8V电源关闭) 时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。 上电,默认使用内部HSI时钟8M,经测试10mA左右。待机模式可实现系统的最低功耗。 可将电流消耗降至两微安。 在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚: ●复位引脚(始终有效) ●当被设置为防侵入或校准输出时的TAMPER引脚 ●被使能的唤醒引脚 /*按钮GPIOB9进入睡眠,WKUP pin(GP
[单片机]
STM32之低功耗——WKUP待机唤醒(LCD显示)
单片机的低功耗 很多单片机有低功耗模式,STM32也不例外。在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发。 STM32电源框图 STM32的三种低功耗模式 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。 停止模式:所有时钟都已停止。1.8V内核电源工作。 PLL,HIS和HSE RC振荡器功能禁止。 寄存器和SRAM内容保留。 待机模式:1.8V内核电源关闭。 只有备份寄存器和待机电路
[单片机]
STM32学习笔记——使用函数库编程控制GPIO口输出
看了网上许多人的代码以及各类开发板所带的例程,大多数使用的都是官方发布的函数库来编程,通过查询后发现,使用函数库来编程可以简化开发过程,并不需要追溯到各个寄存器,通过查看库手册,新手也可以快速应用STM32,因此,决定先从函数库开始入门! 1. 建立带函数库的IAR项目工程 先从网上下载3.5版(据说3.0版以后的固件库才逐渐稳定)stm32固件库(stm32f10x_stdperiph_lib)。由于与固件库版本兼容问题,重新下载安装了IAR6.30版。 1.1 创建项目文件夹 project ; 1.2 解压 stm32f10x_stdperiph_lib.rar 后, 将...stm32f10x_stdperi
[单片机]
STM32如何使用内部时钟源当系统时钟
由于最近老师让做一个项目,要用到STM32但是考虑成本问题,决定不用外部时钟,所以在网上搜集整理了一些资料,加上自己的一些想法。 参考资料: http://bbs.ednchina.com/BLOG_ARTICLE_3011869.HTM http://bbs.21ic.com/icview-587714-1-1.html 首先在主程序中注释掉SystemInit(); 然后使用下面的函数做为系统时钟的初始化函数 void RCC_Configuration(void) { RCC_DeInit();//将外设 RCC寄存器重设为缺省值 RCC_HSICmd(ENABLE);//使能HSI
[单片机]
基于STM32的GSM短信报警系统的设计与实现
引言 随着我国经济建设的迅速发展和人民群众生活水平的极大提高,人们越来越注重自身所处的环境是否安全。特别是当家中无人或者仅有老人孩子时,家庭成员的生命和财产的安全性越来越受到重视。因此,家庭防盗已成为一个重要的社会问题。目前,许多住宅小区的安防主要依靠传统的机械式(防盗网、防盗窗)防盗系统。这样不仅有碍美观,不符合火灾逃生的要求,而且不能有效地防止坏人的侵入。随着电子技术的飞速发展,防盗报警系统已迫切从原来的简单化、局部化向智能化、集成化发展。当前,GSM短信息服务已作为GSM网络的一种基本业务,基于GSM短信模块与单片机相连接应用于家庭无线防盗报警系统中,让家庭防盗更及时、更方便,以最直观的中文短消息形式,直接把案发地点的情况
[单片机]