OpenEdv-开源电子网

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

定时器如何改变PWM的频率?

[复制链接]

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
发表于 2012-7-30 12:40:35 | 显示全部楼层 |阅读模式
定时器的占空比我知道可以改变捕获比较寄存器的值就可以改变了;
那频率怎么改变呢?  
想要改变频率的话,输出波形还能用PWM模式吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-30 14:00:00 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-30 14:00:19 | 显示全部楼层
另外,如果只是需要输出一个频率的话,就用PWM模式,也可以.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
 楼主| 发表于 2012-7-30 14:02:01 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我就只要输出一个波形  但我想通过按键来改变它的频率  可以改变哪个寄存器的值来实现呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-30 14:15:24 | 显示全部楼层
这个就简单了.看不完全手册的PWM实验一章 .
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
 楼主| 发表于 2012-7-30 14:24:25 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
刚才我看了一下,不完全手册上面的例子只是占空比在改变,而频率似乎没变啊
回复 支持 反对

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
 楼主| 发表于 2012-7-30 14:28:06 | 显示全部楼层
回复【6楼】pope_hxj:
---------------------------------
刚才试了下在中断里改变ARR的值能行了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-22
在线时间
0 小时
发表于 2014-11-28 13:18:52 | 显示全部楼层
我看到手册上输出比较模式有四种。。。应该用哪个?
回复 支持 反对

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-17
在线时间
5 小时
发表于 2015-7-17 11:39:03 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,一路那个频率改变的方波(PWM)困惑我还几天,能帮我看下程序么?
#include "stm32f10x.h"
#include "main.h"
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
int pulse;
int StepCount;
int pulse1;
int pulse2;
int t1;
int t2;
int r1;
int r2;
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void TIM2_Configuration(void);
void f(int Vt,int a,int d,int S);
#define VECT_TAB_RAM
int main(void)
{  
  #ifdef DEBUG
    debug();
  #endif
  RCC_Configuration(); 
  NVIC_Configuration();
  TIM2_Configuration();
  GPIO_Configuration();
while(1)
  {
  r1=0;
  r2=10;
  StepCount=0;
  GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));
  TIM2_Configuration();
  do
  {
  }while(r2);
  TIM_Cmd(TIM2, DISABLE);
  Delay(7000000);
  }
}
void GPIO_Configuration(void) 

  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 ;// GPIO_Pin_7;   //PA??3.4.7??CLK,CW/CCW,StepReset
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
#ifdef  VECT_TAB_RAM   
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else                                         
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 
#endif                                                       
  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);
}
void TIM2_Configuration(void)

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_SetCounter( TIM2, 0x0000);
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);       
  TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
  TIM_ARRPreloadConfig(TIM2, ENABLE);        
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 
  TIM_TimeBaseStructure.TIM_Period = 2000;     
  TIM_TimeBaseStructure.TIM_Prescaler = 72;     
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_Cmd(TIM2, ENABLE);       //TIM2 enable counter
}
void RCC_Configuration(void)
{       
  ErrorStatus HSEStartUpStatus; 
  RCC_DeInit();
  RCC_HSEConfig(RCC_HSE_ON);          
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {
  
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    RCC_PCLK1Config(RCC_HCLK_Div2);
    FLASH_SetLatency(FLASH_Latency_2);
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource() != 0x08);
    }
  }  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                                | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE); 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开TIM2的时钟
}   
void Delay(u32 nCount)
{
  do{
    }
  while(nCount--);
}

void f(int Vt,int a,int d,int S)

  int pulse1;
  int pulse2;
  t1=Vt/a;
  
 if(StepCount<t1)                 //?????×????·?t1??????
  {
  r1++;
  pulse1=(150000*t1)/(r1*Vt);
  TIM_SetAutoreload(TIM2,pulse1);//?è??TIMx×???×°???????÷????
  }
                          
 if(t1><=StepCount<=4*S)         
 {
  pulse=150000/Vt;
  TIM_SetAutoreload(TIM2,pulse);
 }

 if(StepCount>4*S)                            
  {
    r2--;
   
  if(t2>=1)
  {
  pulse2=(150000*t2)/(r2*Vt);
  TIM_SetAutoreload(TIM2,pulse2);
  }
 
  }
}



中断:void TIM2_IRQHandler(void)
{   
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  {
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)));
    StepCount=StepCount+1;
    f(300,10,10,4000);
    
  }
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 05:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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