完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
由于做的下玩意需要使用到pwm输出,于是看了下《STM32不完全手册》PWM章节的内容,书中提到如果APB1的分频系数不为1,tiM2-TIM7的时钟为APB1的2倍。
TIMX的定时公式:Time = (arr * (psc + 1)) / SYSCLK 本开发板APB1的是分频系数为2,所以TIM2-TIM7的时钟源应该是72M 我现在需要使用到20KHz的PWM输出,我使用TIM2提供PWM,占空比调节范围为100,即arr为100,这样psc应该为36-1 分频后TIM2的时钟应该是72/36=2M 但是在使用过程中发现pwm的频率 并不是20K 用示波器一看是10K ,怀疑普通定时器的时钟源是72M吗 因为高级定时器TIM1由APB2提供时钟为72M,所以用同样的参数配置TIM1 相对比一下是否会产生同样频率的输出 配置的函数如下: void MAL_Timer1PWM_Init(uint16 arr, uint16 psc) { //Enable Timer2 Clock and GPIOA Clock APB2PeripheralClock_Enable(APB2PeripheralClock_TIM1); APB2PeripheralClock_Enable(APB2PeripheralClock_GPIOA); //GPIO config MAL_GPIO_Mode_Set(GPIO_A, GPIO_Mode_AF_PP, 8); //PA_8 -> GPIO_Mode_AF_PP BIT_SET(GPIOA->BRR, 8); BIT_SET(TIM1->BDTR, 15); TIM1->ARR = arr; TIM1->SC = psc; //PWM config CH1 TIM1->CCMR1 |= 6<<4; //OC1M -> 110(PWM1) BIT_SET(TIM1->CCMR1, 3); //OC1PE -> 1 BIT_SET(TIM1->CCER, 0); //OC1 -> 1 BIT_SET(TIM1->CR1, 7); //APRE Enable BIT_SET(TIM1->CR1, 0); //Timer Enable } void MAL_Timer2PWM_Init(uint16 arr, uint16 psc) { //Enable Timer2 Clock and GPIOA Clock APB1PeripheralClock_Enable(APB1PeripheralClock_TIM2); APB2PeripheralClock_Enable(APB2PeripheralClock_GPIOA); //GPIO config MAL_GPIO_Mode_Set(GPIO_A, GPIO_Mode_AF_PP, 1); //PA_1 -> GPIO_Mode_AF_PP BIT_SET(GPIOA->BRR, 1); MAL_GPIO_Mode_Set(GPIO_A, GPIO_Mode_AF_PP, 2); //PA_2 -> GPIO_Mode_AF_PP BIT_SET(GPIOA->BRR, 2); TIM2->ARR = arr; TIM2->SC = psc; //PWM config CH2 TIM2->CCMR1 |= 6<<12; //OC2M -> 110(PWM1) BIT_SET(TIM2->CCMR1, 11); //OC2PE -> 1 BIT_SET(TIM2->CCER, 4); //OC2 -> 1 BIT_SET(TIM2->CR1, 7); //APRE Enable BIT_SET(TIM2->CR1, 0); //Timer Enable } void Motor_RS380_Init(void) { MAL_Timer1PWM_Init(100, 35); MAL_Timer2PWM_Init(100, 35); TIM1->CCR1 = 50; TIM2->CCR2 = 50; } 先通过Simulator模式看一下输出: 上面为TIM2 CH2产生的PWM 下面为TIM1 CH1产生的PWM 2个定时器的配置参数完全一样 同样50%的占空比 但是可以从图中看出TIM1输出的PWM 比TIM2输出的PWM频率高了1倍 从时间上来看 TIM1输出的频率是20K TIM2输出的频率为10K 这样来算的TIM2的时钟源应该是36M啊 而不是72M TIM1的时钟源是72M 再把开发板接到示波器上看一下 示波器也显示 TIM2输出的是10K 而TIM1刚好是TIM2的2倍 求原子哥以及各位高人讲解一下 TIM2的时钟源究竟是36M还是72M 还是我配置的哪里有问题 |
|
相关推荐
3个回答
|
|
1,时钟频率直接可以在软件仿真的时候看到的.TIM2,你可以进去peripherals里面看.TIM1的也可以看.
2,你的函数都被你自己封装了一层,不太好说.你看看我们代码.虽然是tim3的,但是和tim2是基本完全一样,只需要看时钟初始化部分即可. |
|
|
|
在初始化中 设置了 io模式 arr寄存器 psc寄存器  WM模式、使能位、输出位 启动定时器 应该没问题
Time = (arr * (psc + 1)) / SYSCLK按照这个公式算下来的 arr = 100 psc = 35 如果按照72M来算的话应该是20K 但是实际是输出了10K 好郁闷啊 |
|
|
|
有解决到吗?其实可以看这个答案,如果是用system_stm32f10x.c文件初始化时钟的话,系统默认配置的APB1为2分频的,即36MHZ * 2 =72 MHZ。我是用超时波测距的时候看距离不对,刚刚差了2倍,按APB1最大为36M的话,计算的距离不对的。希望能帮到你
http://news.eeworld.com.cn/mcu/article_2016120832082.html |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1574 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1519 浏览 1 评论
949 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
672 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1565 浏览 2 评论
1852浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
622浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
508浏览 3评论
512浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
494浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 01:24 , Processed in 0.677854 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号