OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8425|回复: 9

pwm输出问题(库函数)

[复制链接]

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-21 15:41:19 | 显示全部楼层 |阅读模式
vu16 CCR1_Val = 5000; /* 初始化输出比较通道1计数周期变量*/
vu16 CCR2_Val = 3000; /* 初始化输出比较通道2计数周期变量*/
vu16 CCR3_Val = 2000; /* 初始化输出比较通道3计数周期变量*/
vu16 CCR4_Val = 600; /* 初始化输出比较通道4计数周期变量*/


/***********************配置RCC寄存器组,使用PLL输出72MHz时钟并作为主时钟源***********************************/
void RCC_Configuration(void)//设置系统各部分时钟
{
/* 定义枚举类型变量 HSEStartUpStatus */
 ErrorStatus HSEStartUpStatus;

  /* 复位系统时钟设置*/
  RCC_DeInit();

  /* 开启HSE*/
  RCC_HSEConfig(RCC_HSE_ON);

  /* 等待HSE起振并稳定*/
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断HSE起是否振成功,是则进入if()内部 */
  if(HSEStartUpStatus == SUCCESS)
  {
    /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* 设置FLASH延时周期数为2 */
    FLASH_SetLatency(FLASH_Latency_2);
    /* 使能FLASH预取缓存 */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* 使能PLL */ 
    RCC_PLLCmd(ENABLE);

    /* 等待PLL输出稳定 */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    /* 选择SYSCLK时钟源为PLL */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* 等待PLL成为SYSCLK时钟源 */
    while(RCC_GetSYSCLKSource() != 0x08);
  }
  /* 打开 TIM2 时钟 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /* 打开 APB 总线上的 GPIOA,USART1 时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//不打开对软件仿真输出没影响,对硬件输出有影响

}

void GPIO_Configuration(void)
{
/* 定义 GPIO 初始化结构体 GPIO_InitStructure */
GPIO_InitTypeDef GPIO_InitStructure;

/* 配置 定时器2比较输出的通道1、2、3、4分别对应的管教GPIOA.0, GPIOA.1, GPIOA.2, GPIOA.3 为第二功能推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM_Configuration(u16 arr,u16 psc)
{
/* 定义 TIM_TimeBase 初始化结构体 TIM_TimeBaseStructure */
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
/* 定义 TIM_OCInit 初始化结构体 TIM_OCInitStructure */
TIM_OCInitTypeDef  TIM_OCInitStructure;
/* 
*   计数重载值为60000//arr:自动重装值
*   预分频值为(0+ 23 = 24)//psc:时钟预分频数
*   时钟分割0
*   向上计数模式
*/
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure);

/* 设置 OC1,OC2,OC3,OC4 通道
*   工作模式为 PWM 输出模式
*   使能比较匹配输出极性
*   时钟分割0
*   向上计数模式
*
* 设置各匹配值分别为 CCR1_Val, CCR1_Val, CCR1_Val, CCR1_Val
* 得到的占空比分别为 50%, 37.5%, 25%, 12.5%  
*/

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);

/* 使能预装载寄存器 */
TIM_OC1PreloadConfig(TIM2 , TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM2 , TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM2 , TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM2 , TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM2, ENABLE);//此处与比较输出不同,PWM输出要使能重装载寄存器ARR来确定周期
/* 启动 TIM 计数 */
TIM_Cmd(TIM2 , ENABLE);
}



/*******************************************************************************
* 函数名   : NVIC_Configuration
* 函数描述     : 设置NVIC参数
* 输入参数     : 无
* 输出结果     : 无
* 返回值       : 无
*******************************************************************************/

void NVIC_Configuration(void)
{
/* 定义 NVIC 初始化结构体 */
NVIC_InitTypeDef NVIC_InitStructure;
/* #ifdef...#else...#endif结构的作用是根据预编译条件决定中断向量表起始地址*/   
#ifdef  VECT_TAB_RAM  
  /* 中断向量表起始地址从 0x20000000 开始 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM , 0x0); 
#else /* VECT_TAB_FLASH */
  /* 中断向量表起始地址从 0x80000000 开始 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);   
#endif

/* 选择优先级分组0 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

/* 开启 TIM2 中断, 0级先占优先级,0级后占优先级 */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
对应输出通道的管脚是PA0、PA1、PA2、PA3。但是为什么PA0(PA0没有被占用)没有出波形?用的是MINI板,而且其他三个管脚出来的方波的电压值只有几百毫伏。。。求教。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2386
金钱
2386
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-4-21 16:23:52 | 显示全部楼层
貌似有些脚就是用不了,我也试过几个,不是每个都能输出PWM
态度决定一切
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-21 17:02:27 | 显示全部楼层
回复【2楼】冰封嗜魔:
---------------------------------
没有吧,凡是可以输出的,都可以输出的啊.
建议楼主软件仿真,看看寄存器配置.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2386
金钱
2386
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-4-21 17:13:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
那可能是我的板子上那个io口被占用了
态度决定一切
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2013-4-22 18:07:04 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
仿真是没问题的,查了原理图,PA0没有被占用啊。。不知道怎么回事?
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2013-5-3 11:37:12 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
木有占用额。。。仿真试过了,用的是mini板。18B20和红外的跳帽都取下了,原子哥,是不是PA0被什么占用了吗?我只用了LCD彩频,其他的没用,然后用的是TIM2的1、2、3、4通道默认管脚输出,也就是PA0,PA1,PA2,PA3四个管脚,但是仿真了PA0就是没有波形出来额。。设置跟其他的三个通道是相同的。
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2013-5-3 11:38:04 | 显示全部楼层
这是仿真图:


回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2013-5-3 12:10:10 | 显示全部楼层
回复【7楼】回首看那个曾经的我:
---------------------------------
好了,解决了。IO设置冲突了。
回复 支持 反对

使用道具 举报

19

主题

113

帖子

0

精华

高级会员

Rank: 4

积分
988
金钱
988
注册时间
2013-4-21
在线时间
307 小时
发表于 2013-6-13 17:26:51 | 显示全部楼层
回复【8楼】回首看那个曾经的我:
---------------------------------
把你正确输出波形的这个例程给我吧,谢谢
淘宝小店(一嵌在线):https://shop126340021.taobao.com
QQ:3287952605
QQ群:491729196
回复 支持 反对

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2013-6-30 18:34:11 | 显示全部楼层
这是pwm四路比较输出的程序包,适用于mini板子。

2_比较输出.rar

1.31 MB, 下载次数: 1139

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 06:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表