OpenEdv-开源电子网

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

求助...用比较输出模式输出PWM波,一直出不来波形,实在是看不出哪里错了,求前辈们助~~~

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-4-11
在线时间
3 小时
发表于 2016-4-11 22:07:58 | 显示全部楼层 |阅读模式
1金钱
附程序,用的是Mini开发板,刚才那个好像发错区了,重新发一下...

[mw_shl_code=c,true]#include "stm32f10x_tim.h"  
#include "stm32f10x_gpio.h"  
#include "timer.h"
#include  <stm32f10x.h>  



unsigned int CCR3_Val=1;   
unsigned int capture1=0;   
void TIM2_Init(void)  
{  
  
        TIM_TimeBaseInitTypeDef  TIM2_TimeBaseStructure;  
        TIM_OCInitTypeDef  TIM2_OCInitStructure;  
        GPIO_InitTypeDef GPIO_InitStructure;  
        NVIC_InitTypeDef NVIC_InitStructure;  

       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //定时器2时钟使能  
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2的通道3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

  NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn ;   //配置定时器中断   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  NVIC_Init(&NVIC_InitStructure);

       
  TIM2_TimeBaseStructure.TIM_Prescaler = 719; //预分频器   
  TIM2_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数模式 TIM2_CR1[4]=0  
  TIM2_TimeBaseStructure.TIM_Period =0xffff;        //自动重装载寄存器            
  TIM2_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseStructure); //
   
  TIM2_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ; //TIM2_CCMR1[14:12]=011  翻转当TIM2_CCR2=TIM2_CNT时,翻转OC2REF的电平   
  TIM2_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性  低电平有效 TIM2_CCER[5]=1;  
  TIM2_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输入/捕获2输出允许  OC2信号输出到对应的输出引脚PB5  
  TIM2_OCInitStructure.TIM_Pulse =CCR3_Val;    //若CC1通道配置为输出:CCR2是装入当前捕获/比较2 TIM2_CCR2寄存器的值(预装载值)。  
  TIM_OC1Init(TIM2, &TIM2_OCInitStructure);  
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);  
   
                                                        
  TIM_Cmd(TIM2,ENABLE); //启动定时器3 TIM2_CR1[0]=1;
       
  TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE); //TIM2_DIER[2]=1  允许捕获/比较2中断  
}  


void TIM2_IRQHandler(void)  
{  
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)    //判断状态寄存器 TIM2_SR[2] 是否发生了捕获/比较2 中断  
  {  
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); //软件清除状态寄存器 TIM2_SR[2] 捕获/比较2 中断中断标志  
    capture1 = TIM_GetCapture1(TIM2); //获取TIM2_CCR2的预装值  
    TIM_SetCompare1(TIM2, capture1+ CCR3_Val); //和CCR2_Val累加后装入TIM2_CCR2 这是为了配合计数器值的递增。以在下一次作出比较。  
  }  
   
}

#include  "stm32f10x.h"  
#include  "stm32f10x_tim.h"  
#include  "misc.h"  

int main(void)  
{      
   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

  TIM2_Init(); //定时器的初始化  
  while(1);  
}  

[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

給你參考一下,TIMER1改成2就可以,我比較輸出四個通道都可以用 uint16_t PrescalerValue; uint16_t CCR1_Val = 1000; uint16_t CCR2_Val = 500; uint16_t CCR3_Val = 250; uint16_t CCR4_Val = 64; void RCC_Init(void) { //pll RCC_ClocksTypeDef Rcc_initstuc; RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); while(RCC_WaitForHSEStartUp==ERROR); RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-7
在线时间
5 小时
发表于 2016-4-11 22:07:59 | 显示全部楼层
給你參考一下,TIMER1改成2就可以,我比較輸出四個通道都可以用

uint16_t PrescalerValue;
uint16_t CCR1_Val = 1000;
uint16_t CCR2_Val = 500;
uint16_t CCR3_Val = 250;
uint16_t CCR4_Val = 64;
void RCC_Init(void)
{
       
        //pll
        RCC_ClocksTypeDef Rcc_initstuc;
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        while(RCC_WaitForHSEStartUp==ERROR);
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        RCC_MCOConfig(RCC_MCO_SYSCLK);
       
        /* PCLK1 = HCLK/4 */
        //RCC_PCLK1Config(RCC_HCLK_Div4);
        //timer3
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       
}       
void TIMER3_Init(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
        TIM_DeInit(TIM3);
        PrescalerValue = (uint16_t) (SystemCoreClock / 2000) - 1;
        TIM_TimeBaseStructure.TIM_Period = 2000;
        TIM_TimeBaseStructure.TIM_Prescaler = 360;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
        //oc1~4&&pulse
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
       
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
       
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);       
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
       
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);
        TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
        //RCC->CR = 9<<1;
        TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
int main(void)
{
        RCC_Init();
        TIMER3_Init();
}
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11553
金钱
11553
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-12 08:45:06 | 显示全部楼层

应当是有例程的,直接对照一下。


回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-4-11
在线时间
3 小时
 楼主| 发表于 2016-4-12 09:55:30 | 显示全部楼层
xuande 发表于 2016-4-12 08:45
应当是有例程的,直接对照一下。

对照过了。。。看不出来哪里错了。。。
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2015-12-16
在线时间
17 小时
发表于 2016-4-12 10:35:41 | 显示全部楼层
最好还是自己用仿真器调试,这样比较好,做出来也是比较开心
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-7
在线时间
5 小时
发表于 2016-4-12 16:22:11 | 显示全部楼层
在TIME_CMD前面加個 TIM_ARRPreloadConfig(TIM2, ENABLE);
試試看吧
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-4-11
在线时间
3 小时
 楼主| 发表于 2016-4-12 16:39:24 | 显示全部楼层
勾勾先生 发表于 2016-4-12 16:22
在TIME_CMD前面加個 TIM_ARRPreloadConfig(TIM2, ENABLE);
試試看吧

依旧不行...
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-7
在线时间
5 小时
发表于 2016-4-12 16:56:09 | 显示全部楼层
你目前是要用OC輸出PWM嗎 ?? 還是進TIMER中斷而已?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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