在线时间80 小时
UID3663409
ST金币900
蝴蝶豆0
注册时间2020-8-6
该用户从未签到
金牌会员
- 最后登录
- 2022-4-19
|
在调试定时器产生高频的方波的时候,我使用的方法时在定时器里直接翻转,设置4M的方波时候频率是对的,但是再高频率就不是按照分频的比例来了,这种问题可能时由于什么原因导致的呢?还是本身stm32就不能支持这么十几兆的软件控制翻转呢、还有顺便请教一下,大家之前测过能道道最高的翻转频率是多少呢
没有人有更好的方法我就结帖:
1.目前的问题还没有解决,定时器直接分出来的频率如果较高的话不能直接用操作寄存器翻转io得到方波,如果速度过快,我的理解是有寄存器的操作,比进中断的时间要长,无法达到想要的频率(这个只是我的理解,如果有问题希望指出),并且在高频的时候波形还有点失真;
2.如果用pwm的话,由于我要输出方波,占空比必须是百分之五十,而周期数要得到我想要的频率要有奇数的分频,没法分;
3.最终用的是output compare的方式(toggle on match),得到了一个一半频率的翻转方波,并且可以切换且相位连贯的波形;
如有问题希望能帮忙指出,也可以学习学习~
这个是我TIM1的初始化函数:
/* TIM1 init function */
void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 1-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 14-1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
这个是中断处理函数
void TIM1_UP_TIM10_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);
if ((GPIOB->ODR & 0x1000) == 0x1000)
{
GPIOB->BSRR = 0x10000000; //PB12
}
else
{
GPIOB->BSRR = 0x1000;//PB12
}
}
main函数就是while(1)循环。
|
|