STM32 定时器 PWM
STM32的PWM控制

Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。APB1和APB2的区别就要在于时钟频率不同。APB2最高频率允许72MH,而APB1最高频率为36MHZ。这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //设置为pwm1输出模式
TIM_OCInitStructure.TIM_Pulse=500; //设置占空比时间
IState = TIM_OSSIState_Disable;//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
我先用STM32的通用定时器用PWM模式产生四路相同占空比,不同频率的PWM波,配置如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2时钟
TIM_InternalClockConfig(TIM2);//使用内部时钟
TIM_BaseInitStructure.TIM_Prescaler=3; //设置TIM时钟频率除数的预分频值
先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。
stm32 pwm调节转速原理

STM32的PWM调节转速原理主要基于PWM(Pulse Width Modulation)脉冲宽度调制。
通过编程控制输出方波的频率和占空比(高低电平的比例),可以实现对电机转速的控制。
在直流电机驱动中,PWM调速的基本原理是通过控制电机通电的电压来实现转速的调节。
当提高电压时,反电势升高,进而转速升高。
因此,通过控制PWM信号的占空比,可以实现对电机通电电压的调节,从而控制电机的转速。
在STM32中,可以通过定时器产生PWM信号,并通过调节占空比来控制电机的转速。
具体实现方式如下:
1.设置定时器工作模式为PWM模式,并配置相应的PWM通道和占空比。
2.根据需要调节占空比的值,以控制电机通电的电压。
3.将PWM信号输出到电机驱动器,从而实现对电机转速的控制。
需要注意的是,具体的PWM调速实现方式可能会因电机的类型、驱动器的型号等因素而有所不同。
因此,在实际应用中,需要根据具体情况进行相应的调整和配置。
STM32定时器输出六路PWM

定时器实验一、实验要求编程序利用STM32的通用定时器TIM2和TIM3产生六路PWM输出。
二、实验原理实验主要考察对STM32F10X系列单片机定时器的使用。
STM32F103系列的单片机一共有11个定时器,其中:✧2个高级定时器✧4个普通定时器✧2个基本定时器✧2个看门狗定时器✧1个系统嘀嗒定时器出去看门狗定时器和系统滴答定时器的八个定时器列表;八个定时器分成3个组TIM1和TIM8是高级定时器TIM2-TIM5是通用定时器TIM6和TIM7是基本的定时器这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式。
本次试验主要用到通用定时器TIM2和TIM3。
通用定时器(TIM2~TIM5)的主要功能:除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)。
通用定时器的时钟来源;a:内部时钟(CK_INT)b:外部时钟模式1:外部输入脚(TIx)c:外部时钟模式2:外部触发输入(ETR)d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器通用定时期内部时钟的产生:通用定时器(TIM2-5)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。
当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。
PWM输出模式;STM32的PWM输出有两种模式:模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。
区别如下:110:PWM模式1,在向上计数时,一旦TIMx_CNT在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
STM32++定时器与+PWM+快速使用入门

STM32 定时器与 PWM 快速使用入门要求:在万利的开发板 EK-STM32F 上产生周期为1秒,占空比分别为 50% 10%的 PWM 并且点亮板上的 LD1,LD2 灯闪烁。
做法很简单。
STM32的PWM是由定时器来产生的。
可以看出。
定时器3的通道1至4在GPIO端口的映像。
如果是完全映射。
各通道的连接引脚如下:CH1=PC6, CH2=PC7, CH3=PC8, CH4=PC9这样,刚好与板上的LD1,LD2灯符合,因为LD1连接到PC7,LD2连接到PC6引脚。
关于PWM一些知识.STM32的TIMx 是 TIMx_ARR 寄存器确定频率(周期)、由TIMx_CCRx 寄存器确定占空比的信号。
使用定时器3。
而TIM2、3、4的时钟源是 APB1 即是 PCLK1 ( APB1 对应 PCLK1 )PCLK1 = APB1 = HCLK/2 = SYSCLK/2 = 36MHZ (36,000,000 HZ)但是注意:倍频器会自动倍2,即是【72MHZ】!代码如下:voidSTM32_PWM_GPIO_Configuration(void){// 11:完全映像STM32_Afio_Regs->mapr.bit.TIM3_REMAP=3;// LD1 =P7 LD2=PC6/*GPIOA Configuration: ( PC6 PC7 ) TIM3 channel 1 and 2 as alternate function push -pull */STM32_Gpioc_Regs-&F6=Output_Af_push_pull; // PC.06 复用功能推挽输出模式STM32_Gpioc_Regs->crl.bit.MODE6=Output_Mode_50mhz; // PC.06 输出模式,最大速度50MHzSTM32_Gpioc_Regs-&F7=Output_Af_push_pull; // PC.07 复用功能推挽输出模式STM32_Gpioc_Regs->crl.bit.MODE7=Output_Mode_50mhz; // PC.07 输出模式,最大速度50MHz}//end subvoidSTM32_TIM3_Configuration(void){// TIM_DeInit( TIM3);//复位TIM3定时器STM32_Rcc_Regs->apb1rstr.all |= RCC_TIM3RST;STM32_Rcc_Regs->apb1rstr.all &= ~RCC_TIM3RST;//时钟使能STM32_Rcc_Regs->apb1enr.all |=RCC_TIM3EN;/* TIM3 base configuration *///TIM_TimeBaseStructure.TIM_Period = 9999;//TIM_TimeBaseStructure.TIM_Prescaler = 7200;//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);STM32_Tim3_Regs->arr.all=9999; // 定时周期,PWM频率! 10毫秒*100=1秒STM32_Tim3_Regs->psc.all=720; // 7200分频 72MHZ/72,00 72,000,000/72,00=10,000STM32_Tim3_Regs->cr1.bit.CKD=0; // 时钟分频因子STM32_Tim3_Regs->cr1.bit.DIR=0; // 0:计数器向上计数/* Clear TIM3 update pending flag[清除TIM3溢出中断标志] *///TIM_ClearFlag(TIM3, TIM_FLAG_Update);STM32_Tim3_Regs->sr.bit.UIF=0; //更新中断标记由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化/* PWM1 Mode configuration: Channel1 Channel2 *///TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OC1Init(TIM3, &TIM_OCInitStructure);// timer3 的通道1 是 PC6 引脚, AFIO完全映射STM32_Tim3_Regs-&1P=0; // 输入/捕获1输出极性 0:OC1高电平有效 1:OC1低电平有效STM32_Tim3_Regs-&1E=1; // 输入/捕获1输出使能 1:开启- OC1信号输出到对应的输出引脚。
stm32 中pwm频率计算公式

一、概述在嵌入式系统开发中,PWM(脉冲宽度调制)是一种重要的控制技术,常用于电机驱动、灯光控制、无线通讯和其他类似应用领域。
对于STM32系列的微控制器来说,如何准确地计算PWM的频率是一个关键问题。
本文将介绍STM32中PWM频率的计算公式,希望对开发者们有所帮助。
二、PWM频率计算公式在STM32系列微控制器中,PWM的频率计算可以使用以下公式:\[PWM频率 = \frac{定时器时钟频率}{预分频系数 * 定时器自动重载值}\]其中,各参数的含义如下:1. 定时器时钟频率:定时器的时钟频率取决于系统时钟的频率以及定时器的分频系数。
一般情况下,定时器的时钟频率可以表示为:\[定时器时钟频率 = 系统时钟频率 / 分频系数\]如果系统时钟频率为72MHz,定时器的分频系数为72,那么定时器时钟频率为1MHz。
2. 预分频系数:预分频系数决定了定时器时钟频率的除数。
通过修改预分频系数,可以改变PWM信号的频率。
在STM32系列微控制器中,通常有多个预分频系数可以选择,开发者可以根据具体应用需求进行选择。
3. 定时器自动重载值:定时器的自动重载值决定了PWM周期的长度。
一般情况下,定时器的计数范围为0到定时器自动重载值,当定时器计数达到自动重载值时,定时器会自动清零并产生中断。
通过以上公式,开发者可以根据具体的系统时钟频率、预分频系数和定时器自动重载值来计算出所需的PWM频率。
三、实例分析为了更直观地理解PWM频率的计算方法,接下来将通过一个实例来演示具体的计算过程。
假设我们需要设计一个PWM信号,其频率为1kHz,系统的时钟频率为72MHz。
我们可以根据需要的PWM频率来确定定时器的自动重载值。
由于所需的PWM频率为1kHz,因此PWM周期为1ms。
根据PWM的工作原理,我们知道PWM信号的周期T与频率f的关系为:\[T = \frac{1}{f}\]PWM周期T为1ms。
我们需要根据系统时钟频率来确定定时器的分频系数。
stm32_定时器3控制PWM的输出脉冲_步进电机的控制

stm32_定时器3控制PWM的输出脉冲_步进电机的控制过程:加速——匀速——减速——停止文件:stepmotor.c 定义步进电机控制程序//用到的tim2为了实现另外的功能可以忽视#include "stepmotor.h"#includeu32 PUL_CNT; // TIM3脉冲计数vu32 step_done;vu32 run_state;#define run_state_stop 0#define run_state_acc 1#define run_state_run 2#define run_state_dec 3void STEPMOTOR_CTRL_INIT(void){GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIO时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定时器3时钟使能//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //定时器2时钟使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7为TIM3通道2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推免输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO口响应速度GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA6为DIR 控制输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推免输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO口响应速度GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3_ConfigurationTIM_TimeBaseStructure.TIM_Period = 23999; //自动重装载寄存器TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频器,t=(23999+1)*(2+1)/72MTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数模式TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时钟分频因子TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //每次溢出都产生事件更新TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //写TIM3各寄存器参数TIM_ClearFlag(TIM3,TIM_FLAG_Update); //中断标志位清零TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许捕获/比较3中断TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM3_CCMR1[14:12]=111 在向上计数时,一旦TIMx_CNTTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输入/捕获2输出允许TIM_OCInitStructure.TIM_Pulse = 40; //确定占空比,这个值决定了有效电平的时间。
stm32中定时器产生不同PWM的基本思路
在stm32中利用定时器TIM调制PWM的几种方法:说说我的学习经历:从开始接触到现在有好几个月了,但是学习还是比较的费劲,而且速度也比较的缓慢,当然相比之前还是有很大的进步,记得刚刚学习的时候,建工程都是大四学长手把手教的。
废话不多说先来讲讲定时器的配置:STM32F10系列最少3个、做多有8个定时器,都是16位定时器,且相互之间是独立的,计数范围为0x0000-0xffff,最大计数值为65535.可以用于测量输入信号的脉冲长度或者产生输出波形(输出比较和PWM)分为通用定时器,高级定时器,以及看门狗定时器下面主要讲通用定时器的配置问题:以定时器TIM1为例:先进行函数的配置void timer1_config(){TIM_TimeBaseInitTypDef TIM_TimeBaseStructure;//开定时器1外设时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1,ENABLE);//计时50000次时间为50000/10M=500msTIM_TimeBaseStructure.TIM_Period=50000 ;TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//720分频TIM_TimeBaseStructure.TIM_ClockDivision =0;//时钟分割为0;//计数模式向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure)//初始化TIM1TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);//开启定时器中断TIM_Cmd(TIM1,ENABLE); //使能定时器}关于时间的计算问题:外设系统时钟的频率为72M,进行720分频以后,频率f=72M/720=100khz. 如果要定时0.1s则计数值为10000,计算公式为:时间(t)=计数值(n)/频率(f).注意计数值n介于0到65535之间有定时器则一定会有中断发生,所以要配置中断优先级,对于中断优先级函数配置如下:V oid nvic_config(){NVIC_InitTypDef NVIC_InitStructure;//抢占优先级为1位,从优先级为3位NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;NVIC_InitStructure.NVIC_IRQChannel=TIM1_IRQn; //定义定时器1为请求通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占式优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //从优先级为2NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断优先级NVIC_Init(&NVIC_InitStructure); //初始化中断}对于优先级中的抢占式和从优先级做如下解释:抢占式优先级:是可以抢占的中断,比如正在执行的优先级为10的中断,突然来了一个优先级为5的中断,此时cpu会转向优先级为5的中断;从优先级:从优先级不会抢占正在执行的中断程序,但是如果两个事件同时发生,那么cpu 会执行优先级高的事件,但是已经执行就不会再更改了,即使优先级比正在执行的高,这正好和抢占式优先级不同,抢占式优先级不论程序是否在执行,只要现在发生的中断优先级比正在执行的要高,就会更改。
stm32pwm初始化函数
stm32pwm初始化函数一、概述PWM(Pulse Width Modulation,脉宽调制)是一种常用的控制技术,用于控制电机、LED等电子设备的亮度或速度。
在STM32中,PWM也是一种常用的控制技术。
本文将介绍如何在STM32中初始化PWM。
二、硬件配置在使用PWM之前,需要先配置好STM32的硬件。
具体步骤如下:1. 选择一个可用的定时器(TIM)。
2. 配置该定时器的时钟源和分频系数。
3. 配置该定时器的计数模式和自动重载寄存器ARR(Auto-Reload Register)的值。
4. 配置输出比较通道(OC)。
5. 配置GPIO引脚作为OC输出口。
三、软件实现1. 初始化定时器首先需要初始化定时器。
具体步骤如下:1. 开启TIMx时钟(x为所选定时器编号)。
2. 设置TIMx分频系数和计数模式。
常见的计数模式有向上计数模式和向下计数模式,可以根据具体需求选择。
3. 设置自动重载寄存器ARR的值。
ARR决定了PWM波形周期长度,可以根据具体需求设置不同的值。
4. 使能更新事件中断,并开启TIMx中断。
5. 启动定时器。
2. 配置输出比较通道接下来需要配置输出比较通道。
具体步骤如下:1. 选择一个可用的输出比较通道(OC)。
2. 配置该OC的工作模式。
常见的工作模式有PWM1模式和PWM2模式,可以根据具体需求选择。
3. 配置该OC的输出极性。
常见的输出极性有正极性和负极性,可以根据具体需求选择。
4. 配置该OC的占空比。
占空比决定了PWM波形高电平时间与周期时间之比,可以根据具体需求设置不同的值。
3. 配置GPIO引脚最后需要配置GPIO引脚作为OC输出口。
具体步骤如下:1. 开启GPIOx时钟(x为所选GPIO端口编号)。
2. 配置该GPIO引脚为AF(Alternate Function)模式,并设置AF 编号为TIMx_CHy(y为所选OC通道编号)。
3. 配置该GPIO引脚的输出类型、驱动能力、上拉/下拉等属性。
stm32f1定时器计算公式
stm32f1定时器计算公式
STM32F1系列微控制器具有多种定时器,包括基本定时器
(TIM6和TIM7)、通用定时器(TIM2至TIM5)和高级定时器
(TIM1)。
这些定时器可用于测量时间间隔、生成脉冲、控制PWM
输出等多种应用。
对于定时器的计算公式,主要涉及到定时器的时钟频率、预分
频系数和计数器的周期值。
以下是一些常见的计算公式:
1. 计数器的周期值计算公式:
计数器的周期值决定了定时器溢出的时间间隔,计算公式为:
计数器周期值 = (定时器时钟频率 / (预分频系数定时器
工作频率)) 1。
2. PWM输出频率计算公式:
如果使用定时器来生成PWM输出,可以根据以下公式计算PWM输出的频率:
PWM输出频率 = 定时器工作频率 / (计数器周期值 + 1)。
3. 定时器中断频率计算公式:
如果需要定时器中断来执行特定的任务,可以根据以下公式计算定时器中断的频率:
中断频率 = 定时器工作频率 / (预分频系数 (计数器周期值 + 1))。
需要注意的是,不同的定时器具有不同的工作模式和特性,因此在使用时需要查阅相关的参考手册和技术资料,以确保计算公式的准确性和适用性。
另外,定时器的配置和使用也需要结合具体的应用场景和需求进行调整和优化。
stm32的pwm输出及频率计算方法
stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。
四、给出了PWM频率和占空比的计算公式。
步骤如下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL //PA6清0GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
3、设定计数器自动重装值及是否分频
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)TIM3->PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。
//TIM3->CCMR1 |= 6 TIM3->CCMR1 |= 7 TIM3->CCMR1 |= 1
5、输出使能设置
TIM3->CCER |= 1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始TIM3
/***************************通道1 ********************************/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2
#endif
TIM.c
#include "STM32Lib\\stm32f10x.h"
void Tim1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
#define GET_RIGHT() (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9))
extern void USART1_Putc(u8 c);
extern void USART_Configuration(void);
extern void USART1_Puts(char * str);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道无效
TIM_OCInitStructure.TIM_Pulse = 300; //占空时间
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
hal.h
#ifndef HAL_H
#define HAL_H
//硬件初始化
extern void ChipHalInit(void);
extern void ChipOutHalInit(void);
//输入宏定义
#define GET_LEFT() (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8))
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM功能使能
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //写比较值(占空比
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period = 2000; //装载值1000k/2000=500hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
GPIO_InitTypeDef GPIO_InitStructure;
/* PA8设置为功能脚(PWM) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; //分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
TIM_TimeBaseStructure.TIM_Period = 1000; //周期
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* PC8按键输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
}
if(GET_RIGHT()==0)
{
while(GET_RIGHT()==0);
if(pulse<=2000)
{
pulse-=60;
}
else
{
pulse=1800;
}
d_2_char(pulse);
USART1_Puts(buffer);
USART1_Puts("\r\n");
}
SetT1Pwm1(pulse);
u8 table[11]={"0123456789 "};
char buffer[10]={"0000000000"};
void Delay(u16 n);
void d_2_char(u32 x)
{
buffer[SIZE+0]=table[x%10000000000/100000];
buffer[SIZE+1]=table[x%1000000000/100000];
{
u16 i;
while(speed!=0)
{
speed--;
for(i=0;i<400;i++);
}
}
extern void SetT1Pwm1(u16 pulse);
int main(void)
{
u16 pulse=300;
ChipHalInit(); //片内硬件初始化
ChipOutHalInit(); //片外硬件初始化
/* TIM1 Main Output Enable */
);
}
//设置捕获寄存器1
void SetT1Pwm1(u16 pulse)
{
TIM1->CCR1=pulse;
}
main.c
/************************************************************
}
}
#include "stm32f10x.h"
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t CCR1_Val = 250;
uint16_t CCR2_Val = 500;
* Function Name : GPIO_Configuration
*设置PD3,PD4,PD5,PD6为键盘输入
*设置PB0,5,8,9; PC5,7; PD7 ;PA8为输出LED灯
*******************************************************************************/
STM32+按键调控PWM输出+串口输出占空比(2010-09-20 21:59)
分类:STM32学习笔记
GPIO.c
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
/*******************************************************************************
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
**实验名称:PWM
**功能:是PA8产生PWM输出,按键调节占空比
*************************************************************/
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#define SIZE 0
buffer[SIZE+6]=table[x%10000/1000];
buffer[SIZE+7]=table[x%1000/100];
buffer[SIZE+8]=table[x%100/10];
buffer[SIZE+9]=table[x%10];
}
//延迟函数
void Delay(u16 speed)
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_DeInit(TIM1);
/*TIM1时钟配置*/