久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
使用單片機(jī)PWM使能L298N驅(qū)動TT馬達(dá),麥克拉姆輪小車驅(qū)動
[打印本頁]
作者:
XYMXYM
時間:
2020-8-15 16:41
標(biāo)題:
使用單片機(jī)PWM使能L298N驅(qū)動TT馬達(dá),麥克拉姆輪小車驅(qū)動
由于學(xué)習(xí)的需要,我們需要制作一個物料搬運小車。
經(jīng)過與小伙伴的一番商討之后,我們決定使用麥克拉姆輪和TT馬達(dá)作為小車的底盤驅(qū)動。
電機(jī)驅(qū)動器我們選用的是L298N(便宜又簡單。)
以下是個人寫的一些代碼,簡單的封裝幾個小車前進(jìn)后退,左右直走的函數(shù)。
麥克拉姆輪排列方式為X型。
單片機(jī)源程序如下:
#include "motor.h"
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "delay.h"
/************電機(jī) A B C D 的使能輸入PWM函數(shù)初始化部分************/
static void GENERAL_TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 輸出比較通道A GPIO 初始化
RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
// 輸出比較通道B GPIO 初始化
RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);
// 輸出比較通道C GPIO 初始化
RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GENERAL_TIM_CH3_PORT, &GPIO_InitStructure);
// 輸出比較通道D GPIO 初始化
RCC_APB2PeriphClockCmd(GENERAL_TIM_CH4_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH4_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GENERAL_TIM_CH4_PORT, &GPIO_InitStructure);
}
/* ---------------- PWM信號 周期和占空比的計算--------------- */
// ARR :自動重裝載寄存器的值
// CLK_cnt:計數(shù)器的時鐘,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信號的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)
static void GENERAL_TIM_Mode_Config(void)
{
// 開啟定時器時鐘,即內(nèi)部時鐘CK_INT=72M
GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
/*--------------------時基結(jié)構(gòu)體初始化-------------------------*/
// 配置周期,這里配置為100K
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 自動重裝載寄存器的值,累計TIM_Period+1個頻率后產(chǎn)生一個更新或者中斷
TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;
// 驅(qū)動CNT計數(shù)器的時鐘 = Fck_int/(psc+1)
TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;
// 時鐘分頻因子 ,配置死區(qū)時間時需要用到
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 計數(shù)器計數(shù)模式,設(shè)置為向上計數(shù)
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 重復(fù)計數(shù)器的值,沒用到不用管
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
// 初始化定時器
TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
/*--------------------輸出比較結(jié)構(gòu)體初始化-------------------*/
// 占空比配置, 這里可用于調(diào)節(jié)電機(jī)轉(zhuǎn)速
uint16_t CCR1_Val = 7;
uint16_t CCR2_Val = 7;
uint16_t CCR3_Val = 7;
uint16_t CCR4_Val = 7;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 配置為PWM模式1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
// 輸出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// 輸出通道電平極性配置
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// 輸出比較通道 1
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
// 輸出比較通道 2
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
// 輸出比較通道 3
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
// 輸出比較通道 4
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
// 使能計數(shù)器
TIM_Cmd(GENERAL_TIM, ENABLE);
}
/************電機(jī) A B C D 的IN輸入函數(shù)初始化部分************/
void Motor_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( MOTOR_INA1_CLK|MOTOR_INA2_CLK|
MOTOR_INB1_CLK|MOTOR_INB2_CLK|
MOTOR_INC1_CLK|MOTOR_INC2_CLK|
MOTOR_IND1_CLK|MOTOR_IND2_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = MOTOR_INA1_PIN|MOTOR_INA2_PIN|
MOTOR_INB1_PIN|MOTOR_INB2_PIN|
MOTOR_INC1_PIN|MOTOR_INC2_PIN|
MOTOR_IND1_PIN|MOTOR_IND2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MOTOR_INA1_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_INA2_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_INB1_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_INB2_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_INC1_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_INC2_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_IND1_PORT, &GPIO_InitStructure);
GPIO_Init(MOTOR_IND2_PORT, &GPIO_InitStructure);
}
void Motor_A_STOP(void)
{
IN1(High);
IN2(High);
}
void Motor_A_PRun(void)
{
IN1(Low);
IN2(High);
}
void Motor_A_NRun(void)
{
IN1(High);
IN2(Low);
}
void Motor_B_STOP(void)
{
IN3(High);
IN4(High);
}
void Motor_B_PRun(void)
{
IN3(Low);
IN4(High);
}
void Motor_B_NRun(void)
{
IN3(High);
IN4(Low);
}
void Motor_C_STOP(void)
{
IN5(High);
IN6(High);
}
void Motor_C_PRun(void)
{
IN5(Low);
IN6(High);
}
void Motor_C_NRun(void)
{
IN5(High);
IN6(Low);
}
void Motor_D_STOP(void)
{
IN7(High);
IN8(High);
}
void Motor_D_PRun(void)
{
IN7(Low);
IN8(High);
}
void Motor_D_NRun(void)
{
IN7(High);
IN8(Low);
}
/********小車前進(jìn)后退和左右直走及停下函數(shù)部分——(麥克納木輪排布方式為X型)*********/
/********具體麥克納木倫擺放方式可以看一下redame.txt文件********/
//小車前進(jìn),ABCD電機(jī)正轉(zhuǎn)
void Car_Forward (void)
{
//A電機(jī)正轉(zhuǎn)
Motor_A_PRun();
//B電機(jī)正轉(zhuǎn)
Motor_B_PRun();
//C電機(jī)正轉(zhuǎn)
Motor_C_PRun();
//D電機(jī)正轉(zhuǎn)
Motor_D_PRun();
}
//小車后退,ABCD電機(jī)反轉(zhuǎn)
void Car_Back_Off (void)
{
//A電機(jī)反轉(zhuǎn)
Motor_A_NRun();
//B電機(jī)反轉(zhuǎn)
Motor_B_NRun();
//C電機(jī)反轉(zhuǎn)
Motor_C_NRun();
//D電機(jī)反轉(zhuǎn)
Motor_D_NRun();
}
//小車左直走,A,D電機(jī)反轉(zhuǎn),B,C電機(jī)正轉(zhuǎn)
void Car_Go_Straight_Left (void)
{
//A電機(jī)反轉(zhuǎn)
Motor_A_NRun();
//B電機(jī)正轉(zhuǎn)
Motor_B_PRun();
//C電機(jī)正轉(zhuǎn)
Motor_C_PRun();
//D電機(jī)反轉(zhuǎn)
Motor_D_NRun();
}
//小車右直走,A,D電機(jī)正轉(zhuǎn),B,C電機(jī)反轉(zhuǎn)
void Car_Go_Straight_Right (void)
{
//A電機(jī)正轉(zhuǎn)
Motor_A_PRun();
//B電機(jī)反轉(zhuǎn)
Motor_B_NRun();
//C電機(jī)反轉(zhuǎn)
Motor_C_NRun();
//D電機(jī)正轉(zhuǎn)
Motor_A_PRun();
}
//小車停下,A,B,C,D電機(jī)都不轉(zhuǎn)
void Car_Stop (void)
{
//A電機(jī)不轉(zhuǎn)
Motor_A_STOP();
//B電機(jī)不轉(zhuǎn)
Motor_B_STOP();
//C電機(jī)不轉(zhuǎn)
Motor_C_STOP();
//D電機(jī)不轉(zhuǎn)
Motor_D_STOP();
}
void GENERAL_TIM_Init(void)
{
GENERAL_TIM_GPIO_Config();
GENERAL_TIM_Mode_Config();
}
復(fù)制代碼
簡單講一下代碼內(nèi)容:使用的是四路通用計時器進(jìn)行L298N的使能,然后再用IO輸出信號,帶動馬達(dá)。(比較簡單的原理)
再順便附帶一下頭文件。
#ifndef __MOTOR1_H
#define __MOTOR1_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
/************電機(jī) A B C D 的使能輸入PWM宏定義部分************/
/************通用定時器TIM參數(shù)定義,只限TIM2、3、4、5********/
// 當(dāng)使用不同的定時器的時候,對應(yīng)的GPIO是不一樣的,可以自行更改
// 我們這里使用的是TIM3,可以根據(jù)實際情況更改
#define GENERAL_TIM TIM3
#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define GENERAL_TIM_CLK RCC_APB1Periph_TIM3
#define GENERAL_TIM_Period (10-1)
#define GENERAL_TIM_Prescaler (72-1)
//由于目前不知道PWM頻率配置多少合適,所以這里暫時隨便配置的一個數(shù)
// 頻率計算公式為: 72M / ARR*(PSC+1)
//占空比計算公式為:CCR/(ARR+1)
// TIM3 輸出比較通道A
#define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
#define GENERAL_TIM_CH1_PORT GPIOA
#define GENERAL_TIM_CH1_PIN GPIO_Pin_6
// TIM3 輸出比較通道B
#define GENERAL_TIM_CH2_GPIO_CLK RCC_APB2Periph_GPIOA
#define GENERAL_TIM_CH2_PORT GPIOA
#define GENERAL_TIM_CH2_PIN GPIO_Pin_7
// TIM3 輸出比較通道C
#define GENERAL_TIM_CH3_GPIO_CLK RCC_APB2Periph_GPIOB
#define GENERAL_TIM_CH3_PORT GPIOB
#define GENERAL_TIM_CH3_PIN GPIO_Pin_0
// TIM3 輸出比較通道D
#define GENERAL_TIM_CH4_GPIO_CLK RCC_APB2Periph_GPIOB
#define GENERAL_TIM_CH4_PORT GPIOB
#define GENERAL_TIM_CH4_PIN GPIO_Pin_1
/************電機(jī) A B C D 的IN輸入函數(shù)初始化部分************/
//TT_MOTOR 輸出比較通道A
#define MOTOR_INA1_PIN GPIO_Pin_6 //定義輸出位置宏,便于移植
#define MOTOR_INA1_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_INA1_CLK RCC_APB2Periph_GPIOB
#define MOTOR_INA2_PIN GPIO_Pin_7 //定義輸出位置宏,便于移植
#define MOTOR_INA2_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_INA2_CLK RCC_APB2Periph_GPIOB
//TT_MOTOR 輸出比較通道B
#define MOTOR_INB1_PIN GPIO_Pin_8 //定義輸出位置宏,便于移植
#define MOTOR_INB1_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_INB1_CLK RCC_APB2Periph_GPIOB
#define MOTOR_INB2_PIN GPIO_Pin_9 //定義輸出位置宏,便于移植
#define MOTOR_INB2_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_INB2_CLK RCC_APB2Periph_GPIOB
//TT_MOTOR 輸出比較通道C
#define MOTOR_INC1_PIN GPIO_Pin_12 //定義輸出位置宏,便于移植
#define MOTOR_INC1_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_INC1_CLK RCC_APB2Periph_GPIOB
#define MOTOR_INC2_PIN GPIO_Pin_13 //定義輸出位置宏,便于移植
#define MOTOR_INC2_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_INC2_CLK RCC_APB2Periph_GPIOB
//TT_MOTOR 輸出比較通道D
#define MOTOR_IND1_PIN GPIO_Pin_14 //定義輸出位置宏,便于移植
#define MOTOR_IND1_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_IND1_CLK RCC_APB2Periph_GPIOB
#define MOTOR_IND2_PIN GPIO_Pin_15 //定義輸出位置宏,便于移植
#define MOTOR_IND2_PORT GPIOB //定義輸出端口宏,便于移植
#define MOTOR_IND2_CLK RCC_APB2Periph_GPIOB
#define High 1
#define Low 0
#define IN1(a) if (a) \
GPIO_SetBits(MOTOR_INA1_PORT,MOTOR_INA1_PIN );\
else \
GPIO_ResetBits(MOTOR_INA1_PORT,MOTOR_INA1_PIN)
#define IN2(a) if (a) \
GPIO_SetBits(MOTOR_INA2_PORT,MOTOR_INA2_PIN);\
else \
GPIO_ResetBits(MOTOR_INA2_PORT,MOTOR_INA2_PIN)
#define IN3(a) if (a) \
GPIO_SetBits(MOTOR_INB1_PORT,MOTOR_INB1_PIN);\
else \
GPIO_ResetBits(MOTOR_INB1_PORT,MOTOR_INB1_PIN)
#define IN4(a) if (a) \
GPIO_SetBits(MOTOR_INB2_PORT,MOTOR_INB2_PIN);\
else \
GPIO_ResetBits(MOTOR_INB2_PORT,MOTOR_INB2_PIN)
#define IN5(a) if (a) \
GPIO_SetBits(MOTOR_INC1_PORT,MOTOR_INC1_PIN);\
else \
GPIO_ResetBits(MOTOR_INC1_PORT,MOTOR_INC1_PIN)
#define IN6(a) if (a) \
GPIO_SetBits(MOTOR_INC2_PORT,MOTOR_INC2_PIN);\
else \
GPIO_ResetBits(MOTOR_INC2_PORT,MOTOR_INC2_PIN)
#define IN7(a) if (a) \
GPIO_SetBits(MOTOR_IND1_PORT,MOTOR_IND1_PIN);\
else \
GPIO_ResetBits(MOTOR_IND1_PORT,MOTOR_IND1_PIN)
#define IN8(a) if (a) \
GPIO_SetBits(MOTOR_IND2_PORT,MOTOR_IND2_PIN);\
else \
GPIO_ResetBits(MOTOR_IND2_PORT,MOTOR_IND2_PIN)
static void GENERAL_TIM_GPIO_Config(void);
static void GENERAL_TIM_Mode_Config(void);
void GENERAL_TIM_Init(void);
void Motor_Config(void);
void Motor_A_STOP(void);
void Motor_A_PRun(void);
void Motor_A_NRun(void);
void Motor_B_STOP(void);
void Motor_B_PRun(void);
void Motor_B_NRun(void);
void Motor_C_STOP(void);
void Motor_C_PRun(void);
void Motor_C_NRun(void);
void Motor_D_STOP(void);
void Motor_D_PRun(void);
void Motor_D_NRun(void);
void Car_Forward (void);
void Car_Back_Off (void);
void Car_Go_Straight_Left (void);
void Car_Go_Straight_Right (void);
void Car_Stop (void);
#endif
復(fù)制代碼
主函數(shù)和那些延時函數(shù)什么的,可以根據(jù)個人興趣愛好編寫。
今天就說這些了,有什么不對的地方 歡迎各位大佬批評指正。
個人初次接觸單片機(jī),小白一枚。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
91久久精品
|
日日骚av
|
在线观看国产wwwa级羞羞视频
|
国产视频一二三区
|
久草免费在线视频
|
亚洲永久免费观看
|
亚洲69p
|
韩日精品视频
|
天天干.com
|
亚洲91
|
在线观看中文字幕视频
|
荷兰欧美一级毛片
|
欧美一区二区精品
|
久久高清
|
羞羞视频一区二区
|
欧美狠狠操
|
亚洲国产aⅴ成人精品无吗 国产精品永久在线观看
|
成人精品在线观看
|
午夜日韩视频
|
久久乐国产精品
|
高清亚洲
|
精品99爱视频在线观看
|
精品99久久
|
欧美激情在线一区二区三区
|
欧美寡妇偷汉性猛交
|
国产成人99久久亚洲综合精品
|
久久午夜精品
|
国产在线视频一区
|
日韩色综合
|
中文字幕 亚洲一区
|
天天操操
|
国产综合一区二区
|
日韩欧美在线免费
|
一区二区视屏
|
久久久99精品免费观看
|
高清国产一区二区
|
成人国产精品一级毛片视频毛片
|
av网站在线播放
|
日本三级全黄三级a
|
亚洲第一成年免费网站
|
99精品国产一区二区三区
|