1,主從門(mén)控模式的介紹
STM32的每個(gè)定時(shí)器都可以由另一個(gè)定時(shí)器觸發(fā)啟動(dòng)定時(shí)器一般是通過(guò)軟件設(shè)置而啟動(dòng),STM32的每個(gè)定時(shí)器也可以通過(guò)外部信號(hào)觸發(fā)而啟動(dòng),還可以通過(guò)另外一個(gè)定時(shí)器的某一個(gè)條件被觸發(fā)而啟動(dòng).這里所謂某一個(gè)條件可以是定時(shí)到時(shí)、定時(shí)器超時(shí)、比較成功等許多條件.這種通過(guò)一個(gè)定時(shí)器觸發(fā)另一個(gè)定時(shí)器的工作方式稱為定時(shí)器的同步,發(fā)出觸發(fā)信號(hào)的定時(shí)器工作于主模式,接受觸發(fā)信號(hào)而啟動(dòng)的定時(shí)器工作于從模式。

從這個(gè)圖中可以TIM3(master)控制TIM1(slave)需要將TIM1的ITR設(shè)置為ITR2
2,使用主從門(mén)控模式輸出如下要求的波形

使用TIM3的CH1控制TIM1的CH1和CH2,每一個(gè)波的周期是25us,一組波的頻率是10HZ
3,TIM的配置
TIM3:


從3,

4,代碼實(shí)現(xiàn)
使用的芯片是stm32f051k6u6,HCLK= 48MHZ
static void MX_TIM3_Init(void)
TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC;
htim3.Init.Prescaler = 480-1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 10020-1; //100ms一組 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 25;//10個(gè)波 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
HAL_TIM_MspPostInit(&htim3);
static void MX_TIM1_Init(void)
TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
htim1.Init.Prescaler = 48-1; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 25-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)
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; sSlaveConfig.InputTrigger = TIM_TS_ITR2; //TIM3 control TIM1 if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK)
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
HAL_TIM_MspPostInit(&htim1);
在main函數(shù)中:
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
在剛上電的時(shí)候PIN腳的電平我們可以在初始的時(shí)候拉高或者拉低:
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
但是PWM波輸出停止之后的PIN腳的電平我們不容易控制,他跟PWM波停止時(shí)的電平狀態(tài)相關(guān),可以使用PIN重新初始化的方式,但是需要耗費(fèi)較長(zhǎng)的時(shí)間。
|