历史上的今天
返回首页

历史上的今天

今天是:2024年09月26日(星期四)

正在发生

2019年09月26日 | stm32-4路pwm优化

2019-09-26 来源:eefocus


/*********************************************************

TIM3输出4路pwm,单独控制占空比

**********************************************************/

 

 

 

#ifndef _PWM_

#define _PWM_

 

#include "stm32f10x.h"

 

 

 

#define  CLOCK 72000

 

void set_pwm1(u32 arr,u16 psc);

void set_pwm2(u32 arr,u16 psc);

void set_pwm3(u32 arr,u16 psc);

void set_pwm4(u32 arr,u16 psc);

 

/*******************************************************************************

* 函 数 名         :PWM4_Init(u16 arr,u16 psc)

* 函数功能     : 4路pwm初始化函数

* 输    入         : 频率,分频

频率:

//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)

* 输    出         : 无

*******************************************************************************/

void PWM4_Init(u32 arr, u32 psc);

 

#endif

 


tim_pwm4.c

/*********************************************************

TIM1输出4路pwm,单独控制占空比

**********************************************************/

 

 

 

#include "tim_pwm4.h"

 

 

 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

 

void set_pwm1(u32 arr,u16 psc)

{

double T_ARR,DPwm_CCR2;

T_ARR=(double)72000000/arr; 

DPwm_CCR2=(double)(T_ARR * psc)/10000;

T_ARR=T_ARR+0.5;//四舍五入算法

DPwm_CCR2=DPwm_CCR2+0.5;//四舍五入算法

// PWM_Config_step((u16)T_ARR, (u16)DPwm_CCR2, 1);

TIM1->ARR = (u16)T_ARR;

TIM1->CCR1 =DPwm_CCR2;

 

}

 

void set_pwm2(u32 arr,u16 psc)

{

double T_ARR,DPwm_CCR2;

T_ARR=(double)72000000/arr; 

DPwm_CCR2=(double)(T_ARR * psc)/10000;

T_ARR=T_ARR+0.5;//四舍五入算法

DPwm_CCR2=DPwm_CCR2+0.5;//四舍五入算法

// PWM_Config_step((u16)T_ARR, (u16)DPwm_CCR2, 1);

TIM1->ARR = (u16)T_ARR;

TIM1->CCR2 =DPwm_CCR2;

 

}

void set_pwm3(u32 arr,u16 psc)

{

double T_ARR,DPwm_CCR2;

T_ARR=(double)72000000/arr; 

DPwm_CCR2=(double)(T_ARR * psc)/10000;

T_ARR=T_ARR+0.5;//四舍五入算法

DPwm_CCR2=DPwm_CCR2+0.5;//四舍五入算法

// PWM_Config_step((u16)T_ARR, (u16)DPwm_CCR2, 1);

TIM1->ARR = (u16)T_ARR;

TIM1->CCR3 =DPwm_CCR2;

 

}

void set_pwm4(u32 arr,u16 psc)

{

double T_ARR,DPwm_CCR2;

T_ARR=(double)72000000/arr; 

DPwm_CCR2=(double)(T_ARR * psc)/10000;

T_ARR=T_ARR+0.5;//四舍五入算法

DPwm_CCR2=DPwm_CCR2+0.5;//四舍五入算法

// PWM_Config_step((u16)T_ARR, (u16)DPwm_CCR2, 1);

TIM1->ARR = (u16)T_ARR;

TIM1->CCR4 =DPwm_CCR2;

 

}

 

 

void PWM4_Init(u32 arr,u32 psc)

{  

         GPIO_InitTypeDef GPIO_InitStructure;

        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        TIM_OCInitTypeDef  TIM_OCInitStructure;

       

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE);  //使能GPIO外设时钟使能

                                                                                     

                                                                             

 

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11 ; //TIM_CH1

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

 

 

        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K

        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频

        TIM_TimeBaseStructure.TIM_ClockDivision =0; //设置时钟分割:TDTS = Tck_tim

        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//TIM1通道一

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

        TIM_OCInitStructure.TIM_Pulse = 100;  /*占空长度 0 – 周期(max)*/

        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高

        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

//TIM1通道二

  TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = 100; /*占空长度 0 – 周期(max)*/

  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);

//TIM1通道三

  TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = 100; /*占空长度 0 – 周期(max)*/

  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);

//TIM1通道四

  TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = 100; /*占空长度 0 – 周期(max)*/

  TIM_OC4Init(TIM1, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);

 

  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        

  TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器

        TIM_Cmd(TIM1, ENABLE);  //使能TIM1

}


推荐阅读

史海拾趣

Antenna Factor公司的发展小趣事

Antenna Factor公司最初由几位热衷于无线通信技术的工程师创立。创业初期,他们面临着资金短缺、技术难题和市场认可度低等多重挑战。然而,他们凭借着对技术的执着和不懈的努力,成功开发出了一款具有高性价比的天线产品,并获得了市场的初步认可。这一突破性的产品为公司的发展奠定了坚实的基础。

DINTEK公司的发展小趣事

随着公司实力的不断增强,Antenna Factor公司开始将目光投向国际市场。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,公司还加大了对海外市场的研发投入和市场推广力度,逐步实现了产品的全球化销售。这一战略不仅为公司带来了更广阔的发展空间,也提升了其在全球电子行业中的竞争力。

通过以上五个故事,我们可以看到Antenna Factor公司在电子行业中的发展历程和取得的成就。他们以技术创新为驱动,不断突破自我,积极拓展市场,加强质量管理和品牌建设,逐步实现了公司的快速发展和壮大。未来,随着无线通信技术的不断进步和应用领域的不断拓展,相信Antenna Factor公司将继续保持领先地位,为电子行业的发展做出更大的贡献。

APEM公司的发展小趣事

为了进一步丰富产品线,APEM在1984年开设了新厂,专业生产开关面板。这一举措不仅扩充了公司的产品种类,也满足了客户对多样化产品的需求。此后,APEM不断推出新产品,逐步形成了完善的开关和控制面板产品线。

BAND-IT公司的发展小趣事

随着电子行业的全球化发展,BAND-IT公司也开始了其全球布局的步伐。作为IDEX Corporation的子公司,BAND-IT在全球范围内建立了销售和制造设施网络,为全球客户提供服务。其产品线不断丰富和完善,涵盖了从扎带、扎扣到紧带机、打包机等各类紧固解决方案。同时,BAND-IT公司还积极投入研发,不断创新产品和技术,以适应电子行业日新月异的发展需求。在全球化的浪潮中,BAND-IT以其卓越的品质和创新能力,赢得了全球客户的信赖和认可。

以上五个故事分别从初创挑战、深海钻探、太空探索、大型基础设施建设以及全球布局等方面展现了BAND-IT公司在电子行业中的发展历程。这些故事基于事实性的描述,旨在展示BAND-IT在电子行业中的发展和贡献,不涉及主观评价。

COTO TECHNOLOGY公司的发展小趣事

随着电子行业的不断发展,小型化、集成化成为产品设计的趋势。COTO TECHNOLOGY紧跟时代潮流,于1983年成功研发出史上首款表面贴装干簧继电器。这一技术的突破不仅提高了产品的生产效率,更使得COTO的产品在小型化方面走在了行业前列。这一创新不仅增强了COTO在市场上的竞争力,也进一步巩固了其在干簧继电器领域的领导地位。

CIF公司的发展小趣事

B公司原本是一家地区性的电子产品供应商,为了拓展国际市场,决定采用CIF交易模式。通过与国外客户的深入沟通和合作,B公司成功打开了多个海外市场。同时,B公司还积极参与国际电子产品展会,提升品牌知名度,进一步巩固了其在全球市场的地位。

问答坊 | AI 解惑

工程急需:可视对讲解决方案,有意者可以联系

工程中遇到的实际问题:一座大厦,楼下部分为商业,上面为公寓写字楼,如何实现可视对讲的门禁作用?前提是:不影响商业部分使用电梯,日常营业,还要保证公寓的安全性。有这方面经验的同志们可以讨论一下。如果有具体产品,只要产品质量有保证,公 ...…

查看全部问答>

求汽车dbc 文件

跪求哪位大兄有dbc文件啊? 最近一个项目有部分要测试到汽车dbc文件。 什么型号的车都可以。 没有这种文件,我们不能测试到所购买的仪器, 也不知道怎么取CAN的数据处理。 大恩大德,无言感激。 …

查看全部问答>

冰天雪地S型裸体拜求高手指点:蓝牙模拟串口问题

硬件环境:硬件多普达智能手机带蓝牙. 软件环境:Smartphone. 程序主干: 1.g_hComDevice= RegisterDevice (L\"COM\", ComIndex, L\"btd.dll\", (DWORD)&pp);    //创建虚拟串口,本地为服务器端 2.g_hComFile = CreateFile (szComPort, ...…

查看全部问答>

请教懂VHDL的高手,帮帮忙!!!

这是一个正负脉宽数控调制信号发生器,就是没有运行成功,有的地方看不懂,请教高手帮忙解释一下,谢谢啦! LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY PULSE IS   PORT(CLK:IN STD_LOGIC;      &nbs ...…

查看全部问答>

UltraEdit的SystemVerilog关键词设置共享

SystemVerilog部分在文件末尾(/L15 打头),每个人的惯用语言不一样,如果你只需要增加SystemVerilog部分而保留其它设置,则把这最后一部分拷下贴到你的 WORDFILE.TXT中就可(别忘了把该文件设为WORDLIST文件:菜单-> 高级->配置->语法高 ...…

查看全部问答>

sd卡读写

u8 MSD_ReadBlock(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead){  u32 i = 0;  u8 rvalue = MSD_RESPONSE_FAILURE;  /* MSD chip&n ...…

查看全部问答>

谁有测量电阻的程序和电路设计给一份参考下 谢谢大家

谁有测量电阻的程序和电路设计给一份参考下 谢谢大家…

查看全部问答>

soso姐和玲珑赶紧起来发TI LM3S811的板子喽

到点了 ,赶紧起床发板子,快点的哈哈哈 ,大家都等不及了…

查看全部问答>

PCI Express设计遇到的问题

用Spartan-6做一个简单的PCIE通信板卡,在生成PCIE IP核时,开辟BAR0为128个字节的IO空间,然后直接利用生成的参考设计,生成bit文件和MCS文件。下载MCS文件到配置FLASH后,断电重新再上电后,工控机的WINDOWS XP设备管理器下能够看到该板卡,但是 ...…

查看全部问答>

arm printf函数问题

用的是arm linux交叉编译工具链编译的,连续的打印四句         printf(\"\\r\\n##### Test TFT LCD #####\\r\\n\");         printf(\"[1] TFT240320 8Bit\\n\\r\");   &nbs ...…

查看全部问答>