完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好。
我正在做一个项目,它有 6 个 PWM 通道,同时会有 3 个通道处于活动状态, 由于所有 PWM 通道必须具有相同的频率,所有 PWM 通道必须同时启动和停止,我试图将 tiM2 定义为 MASTER,将 TIM3 定义为 Slave。 我正在测试一些选项,但我无法继续前进......为了同步(尽可能多)我在两个 TIM 中设置了 Master、Slave 和 CNT 寄存器,所以之后我在中定义了一个断点为了检查 **** 是否相同或几乎相同,但来自 TIM2 和 TIM3 的 CNT 不相同,如我预期的那样运行不紧.. 我正在阅读 RM008 14.3.20 Timer synchronization 并编写了以下几行以将 TIM2 设置为 Master 并将 TIM3 设置为 Slave(如上所述,它不起作用) TIM2->CR2 = TIM_TRGO_ENABLE; TIM3->SMCR = TIM_TS_ITR1 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1; HAL_TIM_Base_Start_IT(&htim2); HAL_TIM_Base_Start_IT(&htim3); TIM2->CNT=0; TIM3->CNT=0; TIM2 和 TIM3 是使用 CUBEMX 定义的,两个定时器在这一点(设置时间)具有相同的配置,但是稍后当程序运行时,当 TIM2 发生溢出中断时,我停止定时器 TIM2 和 TIM3,定义 Master 和 Slave 和将 **** 设置为 0(每次发生溢出时我都会设置 Master 和 slave,我知道这不行,但是因为我只是在测试时钟是否一起工作,所以我想这不是一个大问题, 稍后我会将其移出循环,但我这样做只是为了查看在将(手动)CNT 寄存器设置为 0 后调试器被触发时时钟是如何设置的,STM32CUBE 调试器显示 TIM2/3 **** 值不是等于...这是一个包含 4 个测试的小列表(在调试模式下使用 RESSUME 按钮)。 1° 2° 3° 4° TIM2_CNT 19752 19636 24790 15430 TIM3_CNT 5351 20811 17058 7503 差异 14401 -1175 7732 7927 **** 的值显示 TIM2 和 TIM3 在同步模式下不工作....测试 N°2 显示 TIM2 CNT = 19636 和 TIM3 CNT = 20811,当 TIM2 CNT 在 TIM3 CNT 之前设置为零时....我知道,定时器设置不正确, 这是 CUBMX 完成的 TIM2 和 TIM3 配置: 静态无效 MX_TIM2_Init(无效) { /* 用户代码开始 TIM2_Init 0 */ /* 用户代码结束 TIM2_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* 用户代码开始 TIM2_Init 1 */ /* 用户代码结束 TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 如果(HAL_TIM_Base_Init(&htim2)!= HAL_OK) { 错误处理程序(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; 如果 (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { 错误处理程序(); } 如果(HAL_TIM_PWM_Init(&htim2)!= HAL_OK) { 错误处理程序(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; 如果(HAL_TIMEx_MasterConfigSynchronization(&htim2,&sMasterConfig)!= HAL_OK) { 错误处理程序(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; 如果 (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { 错误处理程序(); } sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; 如果 (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { 错误处理程序(); } 如果 (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { 错误处理程序(); } /* 用户代码开始 TIM2_Init 2 */ /* 用户代码结束 TIM2_Init 2 */ HAL_TIM_MspPostInit(&htim2); } /** * @brief TIM3初始化函数 * @param 无 * @retval 无 */ 静态无效 MX_TIM3_Init(无效) { /* 用户代码开始 TIM3_Init 0 */ /* 用户代码结束 TIM3_Init 0 */ TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* 用户代码开始 TIM3_Init 1 */ /* 用户代码结束 TIM3_Init 1 */ htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 65535; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 如果(HAL_TIM_PWM_Init(&htim3)!= HAL_OK) { 错误处理程序(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; 如果 (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { 错误处理程序(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; 如果 (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { 错误处理程序(); } sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; 如果 (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { 错误处理程序(); } 如果 (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { 错误处理程序(); } /* 用户代码开始 TIM3_Init 2 */ /* 用户代码结束 TIM3_Init 2 */ HAL_TIM_MspPostInit(&htim3); } 简而言之,我需要控制 6 个 PWM 通道,使用来自 TIM2 的溢出中断,当 INT 启动时,主程序将一些值从数组加载到 CCR,这里是两个 PWM 端口的示例: if (R_negativo==0) // estamos entre el INDICE 0 y 1499, es semiciclo + { TIM2->CCR1=lookUptable1[LookUpTableIndiceUsar_R]; //Fase R Semiclo + TIM3->CCR1=0;//Fase R Semiclo - } 别的 { TIM2->CCR1=0;//Fase R Semiclo + TIM3->CCR1=lookUptable1[LookUpTableIndiceUsar_R]; //Fase R Semiclo - } 因此,由于所有 CCR(有 6 个,但 3 个同时处于活动状态)必须同时加载,这就是我需要让 TIM2 和 TIM3 作为主/从工作的原因。 |
|
相关推荐
1个回答
|
|
这意味着:我需要将 TIMX 设置为 Master(直到现在才使用)并将 TIM2/TIM3 设置为 Slave?
对,就是这样。 > 对吗? 我相信是这样。如果它不起作用,请发布您的完整计时器设置代码,我会看一下。 仔细混合寄存器访问和 HAL 功能。对于定时器,我通常更喜欢直接寄存器访问。但我相信你写的应该有用。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2747 浏览 1 评论
3244 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1813 浏览 1 评论
3655 浏览 6 评论
6045 浏览 21 评论
1342浏览 4评论
204浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
359浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
451浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
277浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 01:24 , Processed in 0.986489 second(s), Total 43, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号