ARM38: soft PWM pertraukimas

Pratesiant HUB08 temą. Rašiau, kad OE signalo ilgis reguliuoja visos matricos šviesumą. Ir tokiam reguliavimui labai gerai naudoti “single shot” PWM pertraukimą. T.y. paleidžiam taimerį kuris vieną kartą sugeneruoja PWM signalą kurio ilgis nusistato harwariškai. Toliau galimi du variantai- tiesiogiai naudoti PWM signalą OE valdymui arba naudoti PWM signalo pasibaigimo pertraukimą.
Pasinagrinėjam antrą variantą (pirmas variantas skiriasi tik vienu parametru ir laidelio prijungimu prie dedikuotos kojelės).

Čia kubiko ekrano vaizdas. Šiam eksperimentui pasinaudojam laisvu, trečiu taimeriu:
CubeMX
Taimeris dirba nuo 72MHz bazinio clock. Todėl ir tas prescaller toks: 720-1, t.y. 72000kHz/720=100kHz (10μs) žingsniukais reguliuojasi impulso ilgis.

Prie kubiko generuoto kodo prisideda svetimas kodas. Kiek suprantu paleisti pertraukimą negalima tiesiogiai, nes paleidimo metu susigeneruoja pertraukimas iškarto. Todėl pertraukimas iškarto “išvalomas”.

/* USER CODE BEGIN TIM3_Init 2 */
//svetimas kodas
TIM_CCxChannelCmd(htim3.Instance, TIM_CHANNEL_3, TIM_CCx_ENABLE);
__HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);
__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);
//end svetimas kodas
/* USER CODE END TIM3_Init 2 */

Kai tik pabaigiam derinti visas kojeles ir įjungiam OE signalą, paleidžiam taimerį:

//svetimas kodas. single shot timer3
htim3.Instance->ARR=1; //OE ilgis. 72MHz/(720-1)*4=~51μS; 8=~90μs; 10=~109μs.
__HAL_TIM_ENABLE(&htim3);

ir baigiam pertraukimo kodą. Impulso ilgis (o tiksliau, pauzės tarp pertraukimų ilgis) reguliuojasi ARR registru (Auto Reload Register). Dėl to, kad naudojam programinį kojos valdymą, kojos perjungimui ir softo suveikimui reikia kažkiek laiko. Mano netobulas, fazendos oscilografas parodė pauzės ilgius parašytus komentare- apie 10μs susinaudoja softiniam perjungimui. Jei naudoti PWM dedikuotą kojelę, impulso ilgis bus tikslus.

Naudojant programinį valdymą, OE kojelę perjungiam programiškai globliam taimerių pertraukime (aišku reikia tai įjungti):
cubemx int

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim4){ .... }
if(htim==&htim3){ OE_HI } //Cia galima isjungti OE
}

Leave a Reply

Your email address will not be published. Required fields are marked *