|
1、首先打開(kāi)PWM輸出實(shí)驗(yàn)例程(這里采用正點(diǎn)原子精英版例程),打開(kāi)led.c,對(duì)相關(guān)端口進(jìn)行修改
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9; //設(shè)置IO口,使用 //PB.5,PB.0作為PWM輸出口,
//PB.2 PB.6,PB.7,PB.9作為電機(jī)輸出信號(hào)口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_5); //PB.5 輸出高
GPIO_ResetBits(GPIOB,GPIO_Pin_2|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽輸出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //推挽輸出
//GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽輸出 ,IO口速度為50MHz
//GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 輸出高
}
2、在led.h中定義輸出IO口
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define ENA PBout(5)// PB5
#define IN1 PBout(2)
#define IN2 PBout(6)
#define ENB PBout(0)//PB0
#define IN3 PBout(7)
#define IN4 PBout(9)
#define LED1 PEout(5)// PE5
void LED_Init(void);//初始化
#endif
3、打開(kāi)timer.c,對(duì)pwm初始化函數(shù)進(jìn)行修改
//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動(dòng)重裝值
//psc:時(shí)鐘預(yù)分頻數(shù)
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時(shí)器3時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外設(shè)和AFIO復(fù)用功能模塊時(shí)鐘
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH2的PWM脈沖波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
// GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH3的PWM脈沖波形 GPIOB.0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為T(mén)IMx時(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(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預(yù)裝載寄存器
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
4、最后在主函數(shù)進(jìn)行操作,將PB.5和PB.0接L298N的ENA和ENB,IN1,IN2接PB.2和PB.6,IN3,IN4接PB.7和PB.9
(我這里是通過(guò)按鍵KEY1進(jìn)行加速,KEY_UP進(jìn)行轉(zhuǎn)動(dòng)方向的改變,具體需要什么功能可自行設(shè)置)
int main(void)
{
u16 pwmval;
u8 dir=1;
u8 key,m1,m2;
delay_init(); //延時(shí)函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
LED_Init(); //LED端口初始化
KEY_Init();
TIM3_PWM_Init(899,0); //不分頻。PWM頻率=72000000/900=80Khz
pwmval = 0;
m1 = 0;
m2 = 1;
while(1)
{
key = KEY_Scan(0);
if(key == KEY1_PRES)
{
pwmval -= 50;
}
if(key == WKUP_PRES)
{
pwmval = 350;
m1 = ~m1;
m2 = ~m2;
}
delay_ms(10);
TIM_SetCompare2(TIM3,pwmval);
TIM_SetCompare3(TIM3,pwmval);
IN1 = m1;
IN2 = m2;
IN3 = m1;
IN4 = m2;
}
}
全部資料51hei下載地址:
電機(jī)PWM輸出實(shí)驗(yàn).rar
(281.36 KB, 下載次數(shù): 413)
2018-7-20 16:59 上傳
點(diǎn)擊文件名下載附件
源碼附上
|
|