STM32 PWM 占空比可变函数

发布者:静默思考最新更新时间:2018-09-20 来源: eefocus关键字:STM32  PWM  占空比  可变函数 手机看文章 扫描二维码
随时随地手机看文章

频率 10K,占空比可以达到1%变化的精度,100K只能是10%的变化精度。




#define PWM_CLK1M_ARR_10K 100-1

 

void IzADCPWMInit(uint8_t duty)//10%~90%

{

 

  if(duty>90)

  {

 duty = 90;

  }

  if(duty<10)

  {

 duty = 10;

  } 

//reset 

  /* TIM4 enable counter */

  TIM_Cmd(TIM4, DISABLE);

 

   /* TIM4 Main Output Enable */

  TIM_CtrlPWMOutputs(TIM4, DISABLE); 

//end of reset

 

    /* System Clocks Configuration */

  RCCPWMADCConfiguration();

 

  /* GPIO Configuration */

  GPIOPWMADCConfiguration();

  /* -----------------------------------------------------------------------

    TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:

    The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter

    clock at 24 MHz the Prescaler is computed as following:

     - Prescaler = (TIM3CLK / TIM3 counter clock) - 1

    SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density

    and Connectivity line devices and to 24 MHz for Low-Density Value line and

    Medium-Density Value line devices

    The TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1)

                                                  = 24 MHz / 666 = 36 KHz

    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%

    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%

    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%

    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%

  ----------------------------------------------------------------------- */

  /* Compute the prescaler value */

  //PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;//24M

  //TIM3 Frequency=1MHz/(9999+1) =100Hz

  PrescalerValue = (uint16_t) (SystemCoreClock / 1000000) - 1; //TIM3 counter clock: 1MHz

  /* Time base configuration */

  //TIM_TimeBaseStructure.TIM_Period = 665;//(ARR)

  //TIM3 Frequency=1MHz/(9999+1) =100Hz

  //TIM_TimeBaseStructure.TIM_Period = 10000-1;  //TIM3 counter clock/TIM3 Frequency

  //TIM3 Frequency=1MHz/(99+1) =10 000Hz

  TIM_TimeBaseStructure.TIM_Period = PWM_CLK1M_ARR_10K;//PWM_CLK1M_ARR_100;  //TIM3 counter clock/TIM3 Frequency 

  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

 

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

 

  /* PWM1 Mode configuration: Channel1 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  //CCR1_Val =TIM3_ARR*duty/100;

 // TIM_OCInitStructure.TIM_Pulse = CCR1_Val;

 // TIM_OCInitStructure.TIM_Pulse = (uint16_t)(10000-1)*duty/100; 

  TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_CLK1M_ARR_10K)*duty/100;   

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

 

//  TIM_OC1Init(TIM3, &TIM_OCInitStructure);

 

//  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

//PB6: TM4 Channel1  

  TIM_OC1Init(TIM4, &TIM_OCInitStructure);

 

  TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); 

//PB8: TM4 Channel3

 

  /* PWM1 Mode configuration: Channel3 */

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_CLK1M_ARR_10K)*duty/100;   

 

 

  TIM_OC3Init(TIM4, &TIM_OCInitStructure);

 

  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

 

//PB7: TM4 Channel2

  /* PWM1 Mode configuration: Channel2 */

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse =  (uint16_t)(PWM_CLK1M_ARR_10K)*duty/100; ;

 

  TIM_OC2Init(TIM4, &TIM_OCInitStructure);

 

  TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

#if 0

  /* PWM1 Mode configuration: Channel4 */

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

 

  TIM_OC4Init(TIM3, &TIM_OCInitStructure);

 

 

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

#endif

 

  TIM_ARRPreloadConfig(TIM4, ENABLE);

 

  /* TIM4 enable counter */

  TIM_Cmd(TIM4, ENABLE);

 

   /* TIM4 Main Output Enable */

  TIM_CtrlPWMOutputs(TIM4, ENABLE);

 

}


关键字:STM32  PWM  占空比  可变函数 引用地址:STM32 PWM 占空比可变函数

上一篇:对STM32的CAN1模块的总结
下一篇:ARM中的RO段、RW段和ZI段的区别

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

STM32学习笔记——实时时钟RTC
//通过该例程,学会RTC的配置和读取计数值,数值格式的转换的方法 ,要想控制好的话,要多看资料,多看程序 #include stm32f10x_lib.h vu32 TimeDisplay = 0; ErrorStatus HSEStartUpStatus; u32 THH = 0, TMM = 0, TSS = 0; unsigned int jj = 0; unsigned int LedNumVal = 0 ,LedNumVal1 = 0; //变量定义 //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char D
[单片机]
STM32笔记(一)---串口ISP模式下载原理
-------------------------- –串口ISP模式下载原理– -------------------------- 先放几张火哥的教程截图: 图1 图2 图3 图4 通过图1可以了解到,不同的下载方式中所需要的不同启动模式: 在项目实际应用中的Boot设置: 默认使用程序代码存储在主闪存存储器,配置方式:BOOT0=0,BOOT1=0,但是要预留boot0上拉电阻工位,便于将其电平拉高,实现串口烧录。 如图3所示,只需要通过改变RTS电位使S8550是否导通,导通时实现图2的电路效果将Boot0拉高,否则Boot0为低电位。 一旦完成Boot0与Boot1的10设置后,需要
[单片机]
<font color='red'>STM32</font>笔记(一)---串口ISP模式下载原理
STM32的Code/RO/RW/ZI区、Flash/Ram的占用情况、堆栈大小的设置
以cortex-M3为例,例如STM32F103 这篇文章要讲2个问题: 1、编译出的程序(指令)、变量的存放位置、大小? 2、在代码和keil中,“堆、栈”两者的大小如何设置? keil编译完成后,会有提示,形如: Program Size: Code=1148 RO-data=424 RW-data=20 ZI-data=1636 其中: ① Code为代码,本质上就是一大堆ARM指令; ② RO为只读的数据,例如,char *name = TOM ;//TOM三个字符就存放在ROM中作为RO-DATA;又如,为了减小sin的计算量,把sin的各个值直接制作成表,const float sinVal =
[单片机]
<font color='red'>STM32</font>的Code/RO/RW/ZI区、Flash/Ram的占用情况、堆栈大小的设置
PWM控制渐变七彩灯C51程序
一、硬件介绍: (采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2 、 P1.1 、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下: 二、实物图片: 三、软件部分: 1、/*原理: 先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------ 绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次) -----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变) ---白红过度,技术支持网站:
[单片机]
用<font color='red'>PWM</font>控制渐变七彩灯C51程序
stc单片机IO配置与PWM
I/O口配置 STC2C5201AD系列单片机所有I/O口均可由软件配置成4种工作类型之一,如下表所示。4种类型分别为:准双向口/弱上拉(标准8051输出模式)、强推挽输出/强上拉、仅为输入(高阻)或开漏输出功能。每个口由2个控制寄存器中的相应位控制每个引脚工作类型。STC- 2C5201AD系列单片机上电复位后为准双向口/弱上拉(传统805 的I/O口)模式。2V以上时为高电平,0.8V以下时为低电平。每个I/O口驱动能力均可达到20mA,但整个芯片最大不得超过90mA。 P3口设定 P3.7,P3.6,P3.5,P3.4,P3.3,P3.2,P3.1,P3.0口 (P3口地址:B0H)口地址:B0H))
[单片机]
stc单片机IO配置与<font color='red'>PWM</font>
在Keil环境编程中发现STM32内存管理存在的问题
非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区别。图1是工程示意图,从图中可以看出,除了自己编写的代码外,仅仅增加了2个文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中为了对startup_stm32f10x_hd.s进行修改,将其从库文件夹复制到了项目文件夹中。 图1 代码1 int main() { int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(3): warning: #550-D: variable c was set but never used linkin
[单片机]
在Keil环境编程中发现<font color='red'>STM32</font>内存管理存在的问题
avr频率占空比可调波形输出子函数
#ifndef _KPWM_H_ #define _KPWM_H_ /*************avr频率占空比可调波形输出子函数**************/ ///形参:Fclk赋值设定频率(单位为k) 范围: 1K 到 256K /// rat设定占空比(单位为百分比)eg:40 则输出方波占空比为百分之四十 //频率误差小于2%,占空比误差小于5% //PWM频率计算公式为f=fox/N(1+TOP) fox为晶振频率 N为分频系数 TOP为计数计数最大值 //TOP的反算公式为TOP=FOX/NFclk-1 //在15模式下计数最大值为OCR1A //比较值放在OCR1B //15模式下时钟1到达OCR1B时OC1B
[单片机]
STM32中断和事件的对比差异分析
事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。 事件还是其它一些操作的触发源,比如DMA,还有TIM中影子寄存器的传递与更新;而中断是不能触发这些操作的,所以要把事件与中断区分开。当你只要产生中断而不想触发其它操作时,就可以用事件屏蔽寄存器实现。 在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一定对应一个中断。 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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