关于STM32定时器输出方波时改变频率延时相应的问题
来源:互联网 发布:mac 访问共享文件夹 编辑:程序博客网 时间:2024/06/07 07:24
开始调试方波控制步进电机时,定时器初始化完成后:
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //ʹÄÜTIMxʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜGPIOÍâÉèʱÖÓ
//ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM1 CH1µÄPWMÂö³å²¨ÐÎ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //³õʼ»¯Òý½Å
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ ²»·ÖƵ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_Pulse = 0; //ÉèÖôý×°È벶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE Ö÷Êä³öʹÄÜ
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1ԤװÔØʹÄÜ
TIM_ARRPreloadConfig(TIM1, ENABLE); //ʹÄÜTIMxÔÚARRÉϵÄԤװÔؼĴæÆ÷
TIM_Cmd(TIM1, ENABLE); //ʹÄÜTIM1
}
改变频率用的是函数:
void SetTIM_fr(u32 fr,TIM_TypeDef* TIMx) //µ¥Î»Hz
{
u16 arr,psc;
psc = (u16)(72000000/10000/fr+1+0.5);
arr = (u16)(72000000/psc/fr+0.5);
TIMx->ARR = arr-1; //×Ô¶¯ÖØ×°Öµ
TIMx->PSC = psc-1; //ʱÖÓÔ¤·ÖƵÊý
TIMx->CCR1 = arr/2; //Õ¼¿Õ±È
printf("fr=%d \r\n",fr);
printf("arr=%d psc=%d CCR1=%d \r\n",arr,psc,arr/2);
}
在好长一段时间内系统运行都没有问题
可是前段时间发现个比较奇怪的问题:在设置为小频率后,再设置大频率输出时,被设置的大频率不会立刻输出,而是延时一会输出。
最后解决的办法是:
void SetTIM_fr(u32 fr,TIM_TypeDef* TIMx) //µ¥Î»Hz
{
u16 arr,psc;
up_fr = fr;
// if(fr<750) fr=750;
psc = (u16)(72000000/10000/fr+1+0.5);
arr = (u16)(72000000/psc/fr+0.5);
TIMx->ARR = arr-1; //×Ô¶¯ÖØ×°Öµ
TIMx->PSC = psc-1; //ʱÖÓÔ¤·ÖƵÊý
TIMx->CCR1 = arr/2; //Õ¼¿Õ±È
TIMx->EGR = TIM_PSCReloadMode_Immediate; //
}
然后不要一直操作 TIM_Cmd(TIMx, ENABLE);
定时器打开后就不要开启和关闭来回操作
- 关于STM32定时器输出方波时改变频率延时相应的问题
- 使用STM32定时器输出任意相位差的方波
- 使用STM32的单个普通定时器产生4路不同频率的方波
- STM32方波频率测量
- 关于STM32的延时问题
- 关于LPC2103的改变系统时钟频率后,串口不能正常输出的问题.
- 同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1K的方波
- 利用555定时器实现38KHZ方波的输出
- 如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
- 分享关于stm32f407定时器时钟频率的问题
- 用51单片机做信号发生器,同时输出四种频率的方波
- 关于STM32F4定时器时钟频率问题
- 关于STM32的SysTick定时器的时钟选择问题
- 关于stm32定时器的理解
- 增强型单片机STC12C5A60S2输出各种频率方波信号
- STM32一定时器产生不同频率的PWM
- STM32一定时器产生不同频率的PWM
- 关于STC单片机硬件PWM的分析(PCA),对PWM输出频率的改变
- TCP/IP四层模型中协议的格式
- [DP] BZOJ1025: [SCOI2009]游戏
- 在jsp中引入java类与引入其他jsp用法
- CSDN-markdown编辑器的使用
- Spring读取数据库里面的application.perproties格式的String
- 关于STM32定时器输出方波时改变频率延时相应的问题
- 数字签名是什么?
- html列表
- 使用Hibernate SQLQuery执行原生SQL
- Java多线程基础(一)
- C++如何实现类对象只能动态分配或只能静态分配
- T1 hyf的赌约
- “Beginning Python”(六)“Plot”
- STM32菜鸟成长记录---RS485通讯协议的应用