大概思路就是:用TIM1和TIM4兩個(gè)時(shí)鐘共8個(gè)通道,用PWM來控制小車的4個(gè)輪子。
TIM1中的PA8 A9代表左前輪, A10 A11代表左后輪;
TIM4中的PB6 B7代表右前輪,B8 B9代表右后輪
下面附上完整代碼:
timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM4_PWM_Init();
void TIM1_PWM_Init();
void Prun(); //前進(jìn)
void Nrun(); //后退
void Tleft(); //左轉(zhuǎn)
void Trighet();//右轉(zhuǎn)
#endif
timer.c
#include "timer.h"
#include "led.h"
//TIM4 PWM部分初始化
//PWM輸出初始化
//arr:自動(dòng)重裝值
//psc:時(shí)鐘預(yù)分頻數(shù)
void TIM4_PWM_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定時(shí)器4時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外設(shè)和AFIO復(fù)用功能模塊時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM4
TIM_TimeBaseStructure.TIM_Period = 99; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =719; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
//初始化TIM4 Channel/2/3/4 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM4 OC1
TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM4 OC2
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM4 OC3
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM4 OC4
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的預(yù)裝載寄存器
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的預(yù)裝載寄存器
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR3上的預(yù)裝載寄存器
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR4上的預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM4,ENABLE);
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
void TIM1_PWM_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定時(shí)器1時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外設(shè)
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM1 PWM脈沖波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //TIM_CHX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = 99; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =719; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
//初始化TIM4 Channel/2/3/4 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Disable;//高級定時(shí)器有一個(gè)輸出N不使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCPolarity_High;//
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;//這三個(gè)是高級定時(shí)器要配置的
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;//
//TIM_OCInitStructure.TIM_Pulse=10;
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC1
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC2
TIM_OC3Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC3
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC4
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR1上的預(yù)裝載寄存器
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR2上的預(yù)裝載寄存器
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR3上的預(yù)裝載寄存器
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR4上的預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM1,ENABLE);//使能自動(dòng)重裝載值
TIM_CtrlPWMOutputs(TIM1,ENABLE);//主輸出使能
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
//TIM1中的PA8 A9代表左前輪, A10 A11代表左后輪; TIM4中的PB6 B7代表右前輪,B8 B9代表右后輪
void Prun()
{
TIM_SetCompare1(TIM1,10); //左前前進(jìn)
TIM_SetCompare2(TIM1,0);
TIM_SetCompare3(TIM1,10); //左后前進(jìn)
TIM_SetCompare4(TIM1,0);
TIM_SetCompare1(TIM4,10); //右前前進(jìn)
TIM_SetCompare2(TIM4,0);
TIM_SetCompare3(TIM4,10); //右后前進(jìn)
TIM_SetCompare4(TIM4,0);
}
void Nrun()
{
TIM_SetCompare1(TIM1,0); //左前后退
TIM_SetCompare2(TIM1,10);
TIM_SetCompare3(TIM1,0); //左后后退
TIM_SetCompare4(TIM1,10);
TIM_SetCompare1(TIM4,0); //右前后退
TIM_SetCompare2(TIM4,10);
TIM_SetCompare3(TIM4,0); //右后后退
TIM_SetCompare4(TIM4,10);
}
void Tleft() // 原地左轉(zhuǎn) 左邊的兩個(gè)輪子往后轉(zhuǎn),右邊的兩個(gè)輪子往前轉(zhuǎn)
{
TIM_SetCompare1(TIM1,0); //左前后退
TIM_SetCompare2(TIM1,10);
TIM_SetCompare3(TIM1,0); //左后后退
TIM_SetCompare4(TIM1,10);
TIM_SetCompare1(TIM4,10); //右前前進(jìn)
TIM_SetCompare2(TIM4,0);
TIM_SetCompare3(TIM4,10); //右后前進(jìn)
TIM_SetCompare4(TIM4,0);
}
void Trighet()
{
TIM_SetCompare1(TIM1,10); //左前前進(jìn)
TIM_SetCompare2(TIM1,0);
TIM_SetCompare3(TIM1,10); //左后前進(jìn)
TIM_SetCompare4(TIM1,0);
TIM_SetCompare1(TIM4,0); //右前后退
TIM_SetCompare2(TIM4,10);
TIM_SetCompare3(TIM4,0); //右后后退
TIM_SetCompare4(TIM4,10);
}
進(jìn)行一些簡單說明 上面的重裝載值arr=99,預(yù)分頻系數(shù)psc=719; T=arr * psc /72M,結(jié)果為1ms,也就是頻率為1KHz; PWM模式設(shè)置為TIM_OCMode_PWM1,arr=99, 這樣一來占空比調(diào)整比較方便: arr=10——占空比為10%; arr=20——占空比為20%; 上面的占空比我設(shè)置的是10%,電機(jī)轉(zhuǎn)的比較慢(還可以),你可以根據(jù)你自己的情況進(jìn)行自己更改。
main.c
#include "delay.h"
#include "sys.h"
#include "timer.h"
int main(void)
{
delay_init(); //延時(shí)函數(shù)初始化
TIM4_PWM_Init();
TIM1_PWM_Init();
while(1)
{
Prun();//前進(jìn)
}
}
下面插入一張自己調(diào)試的波形圖片:
11.png (242.36 KB, 下載次數(shù): 36)
下載附件
2020-5-27 23:10 上傳
希望對大家有幫助。
|