历史上的今天
返回首页

历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | STM32f4 PWM输出实验代码

2018-10-05 来源:eefocus

pwm.c源文件代码如下:  

//TIM14 PWM部分初始化  

//PWM输出初始化

//arr:自动重装值   psc:时钟预分频数

void TIM14_PWM_Init(u32 arr,u32 psc)

{                  

  GPIO_InitTypeDef GPIO_InitStructure;

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);  //TIM14时钟使能     

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟

  

  GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GF9复用为 TIM14

  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                //GPIOF9  

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //速度 50MHz

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉

  GPIO_Init(GPIOF,&GPIO_InitStructure);                //初始化PF9

     

  TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频

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

  TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值

  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;  

  TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14

  

  //初始化TIM14 Channel1 PWM模式    

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM调制模式1

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

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性低

  TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //初始化外设TIM1 4OC1

  TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能预装载寄存器

     TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE 使能  

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

}

此部分代码包含了上面介绍的PWM输出设置的前5 个步骤。这里我们关于TIM14 的设置就不再说了。  

接下来,我们看看主程序里面的main函数如下:

int main(void)

{  

  u16 led0pwmval=0;     

  u8 dir=1;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

  delay_init(168);  //初始化延时函数

  uart_init(115200);//初始化串口波特率为115200

    TIM14_PWM_Init(500-1,84-1);  //定时器时钟为84M,分频系数为84,所以计数频率

//为84M/84=1Mhz,重装载值500,所 以PWM频率为  1M/500=2Khz.      

     while(1)   

  {

      delay_ms(10);   

    if(dir)led0pwmval++;//dir==1 led0pwmval递增

    else led0pwmval--; //dir==0 led0pwmval递减  

      if(led0pwmval>300)dir=0;//led0pwmval到达 300后,方向为递减

    if(led0pwmval==0)dir=1;  //led0pwmval递减到 0后,方向改为递增

  

    TIM_SetCompare1(TIM14,led0pwmval);  //修改比较值,修改占空比

  }

}

这里,我们从死循环函数可以看出,我们将led0pwmval这个值设置为PWM比较值,也就是通过led0pwmval 来控制 PWM 的占空比,然后控制 led0pwmval 的值从 0 变到 300,然后又从 300变到0,如此循环,因此DS0 的亮度也会跟着信号的占空比变化从暗变到亮,然后又从亮变到暗。至于这里的值,我们为什么取 300,是因为PWM的输出占空比达到这个值的时候,我们的 LED 亮度变化就不大了(虽然最大值可以设置到 499),因此设计过大的值在这里是没必要的。至此,我们的软件设计就完成了。


推荐阅读

史海拾趣

Emulation Technology Inc公司的发展小趣事

Emulation自创立之初,就专注于模拟和仿真技术的研发。在成立初期,公司成功开发出一款具有革命性的电子系统模拟软件,该软件能够准确模拟电子设备的性能和行为,为工程师们提供了强大的设计工具。这一创新技术迅速获得了市场的认可,成为Emulation公司发展的基石。

台湾第一电阻(Firstohm)公司的发展小趣事
电冰箱电路中常见的易损部件包括启动继电器、过载保护器、温控器等。启动继电器负责启动压缩机,如果其性能不良或损坏,将导致压缩机无法启动。过载保护器用于保护压缩机免受过载损坏,如果其触点接触不良或损坏,也可能导致压缩机无法正常工作。温控器用于控制冰箱的温度,如果其出现故障,将影响冰箱的制冷效果。
Dionics Inc公司的发展小趣事

近年来,随着全球贸易环境的变化和市场竞争的加剧,Dionics Inc也面临着前所未有的挑战。然而,在公司管理层的坚强领导下,全体员工团结一心、共克时艰。公司不仅成功应对了各种挑战和困难,还通过一系列创新举措实现了业务的稳步增长。展望未来,Dionics Inc将继续坚持创新驱动的发展战略,努力成为电子行业的领军企业之一。

Anderson Power Products公司的发展小趣事

近年来,随着全球贸易环境的变化和市场竞争的加剧,Dionics Inc也面临着前所未有的挑战。然而,在公司管理层的坚强领导下,全体员工团结一心、共克时艰。公司不仅成功应对了各种挑战和困难,还通过一系列创新举措实现了业务的稳步增长。展望未来,Dionics Inc将继续坚持创新驱动的发展战略,努力成为电子行业的领军企业之一。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

在快速发展的电子行业中,FTDI始终保持着高度的警惕性和创新精神。面对假冒芯片的威胁,公司采取了强有力的打击措施以维护用户权益和市场口碑。同时,为了更好地满足市场需求,FTDI不断加强技术团队建设,引进经验丰富的工程师和有潜力的大学毕业生,不断提升自身的研发实力和技术水平。此外,公司还密切关注市场动态和技术趋势,以便及时调整战略方向并推出具有竞争力的新产品。通过这些努力,FTDI在电子行业中持续保持着领先地位。

Dawning Precision Co Ltd公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

问答坊 | AI 解惑

msp430串口收发程序

现在想用msp430的串口进行收发程序开发,但不知道对方一次发送过来多少数据?如何才能完整接收呢?我感觉使用中断的方式一次只能接收一个字节的数据,不能把对方发送的完整数据全部接收!请问有什么解决办法?谢谢! 另外,使用串口通信,一方是ms ...…

查看全部问答>

wince下读写IC卡速度问题

在pc下测试,串口读写只要3s 在wince下测试,居然10s啊,怎么解决?? 怎么办 ?? 救命 …

查看全部问答>

有一套串口通信协议需要分析破解,寻求达人帮助

有一套串口通信协议需要分析破解,寻求达人帮助! 谢谢! to:hawking20001981(东东VC++Primer) 请速和我联系! QQ:652650436…

查看全部问答>

为什么RTC计数器有时会清零?

                                 请教:用STM32F101的RTC作时历时钟时,在有后备电池的情况下,发现偶尔时钟会清零,好像发生在断电或加电后,有办法 ...…

查看全部问答>

【原创】:关于42x0TA问题

我用ta做pwm输出,设置如下: void init_timer_a(void) { TACTL = TASSEL1 +TACLR + MC_1; //选择SMCLK为时钟,定时器清空,选择up模式,中断允许 TACCTL0 = CCIE; //将CCR0设为比较模式,中断允许+ TAIE TACCR0 = 1 ...…

查看全部问答>

stm32F101死机,手动复位无效,只能上电复位

stm32F101死机,手动复位无效,只能上电复位,我应该检查什么地方?…

查看全部问答>

新手求解答 AD软件中 DB9的原理图后面怎么会有两条线

AD软件中 DB9的原理图后面怎么会有两条线 如图所示正常DB9不是没有吗 怎么去掉??新手求解答…

查看全部问答>

稳压电源中的芯片可以选择LM2576吗?

刚开始接触电源模块,想要自己做一个输出12V/25W的电源,给功放供电,初步方案是220V交流经过24V/30W变压器,然后通过桥堆和一大一小2个滤波电容,再经过LM2576-ADJ开关稳压芯片,最终输出12V,25w的电源,可我看到上大部分线性稳压电源的稳压芯片 ...…

查看全部问答>