在進行PWM輸出時,碰到的一個問題(關于PWM暫停現象的)
一、問題描述
定時器的配置:
void MX_TIM14_Init(void)
{
TIM_OC_InitTypeDef sConfigOC;
htim14.Instance = TIM14;
htim14.Init.Prescaler = 15-1;
htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
htim14.Init.Period = 64000-1;
htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
if (HAL_TIM_OC_Init(&htim14) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_TIM_MspPostInit(&htim14);
}
當我按鍵按下的時候,寫flash,這個時候PWM輸出的波形為20ms低電平,20ms高電平;然后我想讓在寫flash的時候,PWM輸出的一直為低,百度也找了下,說是控制占空比,但是我試了下,效果不是很好,
[圖1是不控制比較值,下面是寫flash時候的代碼]
// __HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 64000);
__disable_irq();
Write_Flash_Buf(FLASH_RF_PIN_MODE_ADR,(uint8_t *) modebuff, sizeof(modebuff));
Write_Flash_Buf(FLASH_RF_PIN_DATA_ADR, Slave_re_Pindata_temp, sizeof(Slave_re_Pindata_temp));
__enable_irq();
當我將上面屏蔽的 // __HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 64000); 打開時, 采集到的現象是圖2
在圖2中的1,這個時候寫flash前是低電平的, __HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 64000); 設定這個比較值,然后在寫flash的時候電平一直是低電平的;
但是圖2中的2,flash前正好是高電平,設定這個比較值,然后在寫flash的時候電平一直是高電平的;
我想達到的目的就是在寫flash前,將其電平一直為低
【圖1】

【圖2】

二、處理方法
我目前的做法
主要是等待到他電平為低,在讓他保持當前值
方法一:由于我在寫flash的時候,將中斷關閉了,而修改定時器比較值又是在定時器中斷執行的,所以我關閉中斷前,要將PWM輸出低電平
主要修改了兩個地方
1.定時器中斷中,當我按鍵產生的標志,那么會執行下面這些,當高電平進入中斷,則保持他之前輸出的高電平時間,低電平的話,就讓他保持當前狀態
if(HAL_GPIO_ReadPin(timch->GPIOx, timch->GPIO_Pin) == GPIO_PIN_SET)//讀取該定時器對應引腳電平 高電平
{
timch->count =__HAL_TIM_GET_COMPARE(&timch->htim, timch->channel) + (4864+Buf[rps[timch->rpspin].mode]-2048);
timch->count = (timch->count>TIM_PERIOD) ? (timch->count-TIM_PERIOD) : (timch->count);//比較值大于重裝載值 減去重裝載值
__HAL_TIM_SET_COMPARE(&timch->htim, timch->channel, timch->count); //設定比較值
}
else //低電平
{
__HAL_TIM_SET_COMPARE(&timch->htim, timch->channel,64000); //保持當前電平
}
2.在寫flash前,等待電平為低,再輸出64000(100%)保持當前電平
while(HAL_GPIO_ReadPin(TIMCH_Buff[i].GPIOx, TIMCH_Buff[i].GPIO_Pin) != GPIO_PIN_RESET){}
__HAL_TIM_SET_COMPARE(&TIMCH_Buff[i].htim, TIMCH_Buff[i].channel, 64000);
__disable_irq();
Write_Flash_Buf(FLASH_RF_PIN_MODE_ADR,(uint8_t *) modebuff, sizeof(modebuff));
Write_Flash_Buf(FLASH_RF_PIN_DATA_ADR, Slave_re_Pindata_temp, sizeof(Slave_re_Pindata_temp));
__enable_irq();
方法二:當寫flash前后沒有對中斷進行開關
那么可以直接在寫flash前等待他為低電平,然后對定時器輸出進行關閉,寫完之后再開啟
while(HAL_GPIO_ReadPin(TIMCH_Buff[i].GPIOx, TIMCH_Buff[i].GPIO_Pin) != GPIO_PIN_RESET){}
HAL_TIM_OC_Stop_IT(&TIMCH_Buff[i].htim, TIMCH_Buff[i].channel);
Write_Flash_Buf(FLASH_RF_PIN_MODE_ADR,(uint8_t *) modebuff, sizeof(modebuff));
Write_Flash_Buf(FLASH_RF_PIN_DATA_ADR, Slave_re_Pindata_temp, sizeof(Slave_re_Pindata_temp));
HAL_TIM_OC_Start_IT(&TIMCH_Buff[i].htim, TIMCH_Buff[i].channel);
此次記錄,主要是因為PWM輸出到舵機時,當我按鍵按下后,在進行寫flash的時候,舵機出現抖動,通過邏輯分析儀采集到PWM輸出波形會出現20ms高電平,20ms低電平(因為關閉中斷了,而修改比較值是在定時器中斷中),現在通過上述方法,在寫flash時,舵機不會出現抖動,邏輯分析儀采集的現象在寫flash的時候,PWM波形是低電平,
文章如有問題,歡迎大家進行指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262112.html
標籤:其他
上一篇:【元胞自動機】基于matlab元胞自動機收費站的交通問題【含Matlab原始碼 357期】
下一篇:洛谷P1488 肥貓的游戲
