打印

PWM求助

[复制链接]
1717|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rainsinging|  楼主 | 2013-2-2 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本来是要实现通过PWM的脉宽来实现LED灯的亮度,LED为PC7口,芯片为STM32f103VE,现在不知道为什么灯都不会亮,求高手帮忙解惑,谢谢!

#include<stm32f10x_lib.h>
#include"sys.h"
#include"delay.h"
#include"pwm.h"
int main(void)
{
u16 led2pwmval=0;
u8 dir=1;   //亮灯方向
Stm32_Clock_Init(9);
delay_init(72);
PWM_Init(900,0);//pwm频率72000/900=8K
while(1)
{
  delay_ms(10);
  if(dir)
   led2pwmval++;
  else
   led2pwmval--;
  if(led2pwmval>300)
   dir=0;
  if(led2pwmval<=0)
   dir=1;
  LED2_PWM_VAL=led2pwmval;  
}
}

void PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;
RCC->APB2ENR|=1<<4;//PC7
GPIOC->CRL&=0X0FFFFFFF;
GPIOC->CRL|=0XB0000000;
GPIOC->ODR|=1<<7;
TIM3->ARR=arr;
TIM3->PSC=psc;
TIM3->CCMR1|=7<<12;   
TIM3->CCMR1|=1<<11;   
TIM3->CCER|=1<<4;   
TIM3->CR1=0X0080;   
TIM3->CR1|=0X01;   
}

#ifndef __PWM_H
#define __PWM_H
#include"sys.h"
#define LED2_PWM_VAL TIM3->CCR2
void PWM_Init(u16 arr,u16 psc);
#endif
沙发
香如故| | 2013-2-2 17:50 | 只看该作者
用寄存器去操作啊?容易出错,用固件函数操作啊

使用特权

评论回复
板凳
rainsinging|  楼主 | 2013-2-2 18:00 | 只看该作者
香如故 发表于 2013-2-2 17:50
用寄存器去操作啊?容易出错,用固件函数操作啊

固件库操作这个已经实现过了,想试下寄存器操作,不清楚是哪里的问题

使用特权

评论回复
地板
rainsinging|  楼主 | 2013-2-2 18:04 | 只看该作者
PWM_Init补充一句
RCC->APB2ENR|=1<<0;//AFIO enable
还是不行啊。。。

使用特权

评论回复
5
rainsinging|  楼主 | 2013-2-2 21:13 | 只看该作者
TIM3_CH2 复用功能重映射的管脚是PA7(没有重映射),PB5(部分重映射),PC7(完全重映射),不知道把复用功能映射在这些管脚上,是否要对什么寄存器进行操作啊?求高手解惑啊。

使用特权

评论回复
6
rainsinging|  楼主 | 2013-2-3 09:02 | 只看该作者

使用特权

评论回复
7
rainsinging|  楼主 | 2013-2-3 15:30 | 只看该作者
我将PA7,PB5,PC7三个脚全设为复用输出功能,并将TIM3->CCR2设为固定值200,仿真观察这三个脚的波形,PA7为高电平,其他为低电平,但没有出现应有的波形,很是困惑啊,求大侠们帮忙解答啊

使用特权

评论回复
8
21ID| | 2013-2-3 21:30 | 只看该作者
建议楼主先确认一下能不能控制IO口高低电平。

使用特权

评论回复
9
rainsinging|  楼主 | 2013-2-3 22:33 | 只看该作者
21ID 发表于 2013-2-3 21:30
建议楼主先确认一下能不能控制IO口高低电平。

我试过PC7单做推挽输出,可以点亮LED灯的

使用特权

评论回复
10
21ID| | 2013-2-4 15:46 | 只看该作者
rainsinging 发表于 2013-2-3 22:33
我试过PC7单做推挽输出,可以点亮LED灯的

是在没有用函数库的情况下吗?

使用特权

评论回复
11
rainsinging|  楼主 | 2013-2-4 17:12 | 只看该作者
21ID 发表于 2013-2-4 15:46
是在没有用函数库的情况下吗?

是的,我是想通过操作寄存器来实现它

使用特权

评论回复
12
zhoukun00| | 2013-2-13 19:24 | 只看该作者
本帖最后由 zhoukun00 于 2013-2-17 12:49 编辑

没有重映射端口,
AFIO->MAPR&=0xffff3ff;//清除MAPR的[11:10]
AFIO->MAPR|=3<<10;//MAPR的[11:10]置11,完全重映射
应该是右移10位,呵呵,粗心了。

使用特权

评论回复
评论
rainsinging 2013-2-15 11:52 回复TA
的确是这个没弄的原因,谢谢你!(AFIO->MAPR|=3<<10;) 
13
zhoukun00| | 2013-2-13 19:26 | 只看该作者
上面两行代码加到PWM初始化函数里,:)昨天刚看到这部分,呵呵。

使用特权

评论回复
14
zhoukun00| | 2013-2-13 19:29 | 只看该作者
GPIOC->ODR|=1<<7;
这一句不用要,PWM不用这样初始化端口输出电平,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

80

帖子

0

粉丝