当前位置:首页 > 资讯 > info5 > 正文

【菜鸟入门】stm32 之 pwm

发表于: 2013-11-21   作者:ieczw   来源:转载   浏览:
摘要: 这个pwm几天前就搞出来了,但是觉得不是很难,就没有写今天jlink固件坏了,修了半天没有修好,现在就先扔着吧,先借大黄的用用,下面闲着木事,就把pwm写下吧好吧,开始今天的pwm还是老话,先附上一段代码:(由于stm的pwm有多个,每个又有多个通道,我们今天选TIM2_CH1来产生)/* *TIM2_CH1 */ intpwm_init(u16arr,u16psc) { RCC->APB1ENR

这个pwm几天前就搞出来了,但是觉得不是很难,就没有写

今天jlink固件坏了,修了半天没有修好,现在就先扔着吧,先借大黄的用用,下面闲着木事,就把pwm写下吧

【菜鸟入门】stm32 之 pwm_第1张图片

【菜鸟入门】stm32 之 pwm_第2张图片

好吧,开始今天的pwm

还是老话,先附上一段代码:(由于stm的pwm有多个,每个又有多个通道,我们今天选TIM2_CH1来产生)

/*
 * TIM2_CH1 	
 */
int pwm_init(u16 arr,u16 psc)
{
	RCC->APB1ENR = 1<<0; 			//enable timer2
	RCC->APB2ENR = 1<<2; 			//enable GPIOA
	
	GPIOA->CRL &= ~(0xF<<0);	//Clear bit0 Control Register
	GPIOA->CRL |= 0xb<<0;			//Set Bit0 Control Register
//	GPIOA->ODR |= 1<<0;				//Enable Bit0
	
	TIM2->ARR = arr;
	TIM2->PSC = psc;
	
	TIM2->CCMR1 |= 7<<4;
	TIM2->CCMR1 |= 1<<3;
	TIM2->CCER |= 1<<0;
	TIM2->CR1 |= 1<<0;
	return 0;
}

前5句,现在大家都应该懂了吧,TIMER时钟配置,管脚时钟配置,管脚模式配置,这里肯定要配置称输出模式

由于咱们选用的是TIMER2,那我们就用TIM2

先设置自动装载寄存器ARR和预分频寄存器PSC,这两个寄存器一起来设置分频的频率

举个例子:

PCLK = 72M = 72000KHz,设置ARR = 900,PSC = 1;

则输出的PWM周期为:72 000 /(900*(1+1) ) = 40KHz

至于CCMR比较/捕获模式寄存器

他有 两个功能,当选择比较寄存器的时候,看上面一栏,捕获模式时看下面一栏

输出比较模式,他有两种输出模式,OC1和OC2,其实总共有4组,他有4路输出,CCMR1,CCMR2分别控制两组;

我们这里用的是CH1通道,所以我们需要配置0~7bit的数据。

首先我们来了解下pwm输出模式:



根据这段描述,这里的无效电平,会导致OCxREF为低电平,从而管脚输出电压即为低电平。

所以,011:在把低电平换位高电平,高电平换成低电平

100:输出全部为低电平

101:输出全为高电平

110:先输出高电平,再输出低电平,之类的CCR1比较/捕获寄存器是用来区分什么时候发生电平跳变的,CCRx寄存器也有4组,我们用的是CH1通道,估大家都懂,我们应该用CCR1

111:跟上一组相反

【菜鸟入门】stm32 之 pwm_第3张图片

int main()
{
	sys_init(9);
	pwm_init(900,3);	//Set Period
	RCC->APB2ENR |= 1<<6;
	GPIOE->CRL &= ~(0xf<<0);
	GPIOE->CRL |= 0xb<<0;
	GPIOE->ODR |= 1<<0;
	TIM2->CCR1 = 0;
	sw5_config();
	while(1)
	{
				if(!(GPIOE->IDR & GPIO_Pin_14))
				{
						delay_ms(20);
						if(!(GPIOE->IDR & GPIO_Pin_14))
						{
							TIM2->CCR1 += 10;
						}
						while(!(GPIOE->IDR & GPIO_Pin_14));
				}
	}
}

【菜鸟入门】stm32 之 pwm_第4张图片

这里ARR = 900,PSC = 3

所以: F = 72000KHz/(900*(3+1)) = 20KHz

基本上跟示波器上的一样

关于pwm的配置是相对比较简单的,大家不要被他寄存器的数量吓到了,那么多寄存器,是因为他有多路,所以,他会有那么多,学会了一路,其他都是非常easy的!




【菜鸟入门】stm32 之 pwm

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
  PWM是pulse width modulation的缩写,即脉冲宽度调制。其通过对一系列脉冲的宽度进行调制,来等
啊啊啊,先叫两声,释放释放今天的压抑。。搞了一天终于把中断给搞定。 中断寄存器怎么说呢,两个字
由于STM32没有专门的PWM引脚,所以使用IO口的复用模式,通用定时器TIM2-TIM5每个可以产生4路PWM(CH
STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM
经过今天一天的努力终于完成了我的stm32第一个程序;我也是今天才开始接触stm32。 由于苦于没有资料
STM32单片机PWM输出测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主
STM32单片机PWM输出测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主
网上看到一篇文章,不是很完整,但是有助于我理解,个人觉得还可以,具体的代码,网上有很多,大家
 u16 minarr = 249; u16 maxarr = 499; u16 i = 0; void TIM3_IRQHandler(void) //TIM3中断 { u
一、基础学习 1、何为CSS CSS是Cascading Style Sheets(层叠样式表)的简称,是一种标记语言,它不需
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号