/**********************************************************************************
** 红龙开发板
** 实验名: 红龙板_基定时器(带视频)
** KEIL MDK-ARM Standard Version:4.11
** 软件库(keil) Version: unused
** 固件库(ST) Version: V3.5
** 使用外设: 基定时器
**********************************************************************************/
程序测试说明: #define TEST_1 TEST_1 LED灯测试
#define TEST_2 TEST_2 按键测试
LED 测试说明:注释掉 TEST_2 按键测试 //#define TEST_2
初始化系统时钟
LED灯的IO口初始化
测试现象: JLINK下载运行后,三个LED灯轮番闪烁。
-----------------------------------------------------------------------------------
TIM 测试说明:TIM定时器定时点灯(高级定时器TIM1,通用定时器TIM2 均可设置,
其他定时器以此为例,均能快速掌握)
步骤:初始化系统时钟
中断初始化
TIM初始化
注意:中断使能(NVIC)
中断函数调用(STM32F10X_IT.C)
实验现象:
JLINK下载运行后
软件:定时时间到,发生一次更新事件Update;
硬件:LED1灯按设置闪烁。打开和关闭LED3由亮渐灭控制。
/********************************************************************************************
*函数名称:void RCC_Configuration(void)
*功能说明:系统时钟初始化配置
* RCC_HSICmd(ENABLE);//使能内部高速晶振 ;
* RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//选择内部高速时钟作为系统时钟SYSCLOCK=8MHZ
* RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK时钟源为系统时钟SYYSCLOCK
* RCC_PCLK1Config(RCC_HCLK_Div4); //APB1时钟为2M
* RCC_PCLK2Config(RCC_HCLK_Div4); //APB2时钟为2M
* RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能APB2外设GPIOB时钟
*******************************************************************************************/
void RCC_Configuration(void);
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08);
}
#define GPIO_IN GPIOB
#define GPIO_PWM GPIOA
#define GPIO_Pin_IN1 GPIO_Pin_1
#define GPIO_Pin_IN2 GPIO_Pin_2
#define GPIO_Pin_IN3 GPIO_Pin_5
#define GPIO_Pin_IN4 GPIO_Pin_6
#define GPIO_PWM_A GPIO_Pin_8
#define GPIO_PWM_B GPIO_Pin_11
#define IN1_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN1);
#define IN1_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN1);
#define IN2_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN2);
#define IN2_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN2);
#define IN3_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN3);
#define IN3_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN3);
#define IN4_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN4);
#define IN4_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN4);
#define PWM_A_OFF 1000
#define PWM_B_OFF 1000
单片机源程序如下:
- #define GPIO_IN GPIOB
- #define GPIO_PWM GPIOA
- #define GPIO_Pin_IN1 GPIO_Pin_1
- #define GPIO_Pin_IN2 GPIO_Pin_2
- #define GPIO_Pin_IN3 GPIO_Pin_5
- #define GPIO_Pin_IN4 GPIO_Pin_6
- #define GPIO_PWM_A GPIO_Pin_0
- #define GPIO_PWM_B GPIO_Pin_1
- #define IN1_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN1);
- #define IN1_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN1);
- #define IN2_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN2);
- #define IN2_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN2);
- #define IN3_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN3);
- #define IN3_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN3);
- #define IN4_H GPIO_SetBits(GPIO_IN,GPIO_Pin_IN4);
- #define IN4_L GPIO_ResetBits(GPIO_IN,GPIO_Pin_IN4);
- #define PWM_A_OFF 1001
- #define PWM_B_OFF 1001
- #include "pbdata.h"
- void TimCounterInit(int rate_1,int rate_2);
- void Gpio_PWM_Init(void);
- void Gpio_M_Init(void);
- void NVIC_Configuration(void);
- void TurnLeft(void);
- void TurnRight(void);
- void straight(void);
- void sternway(void);
- int A,B;
- /****主函数****/
- int main(void)
- {
- u8 flag=1;
- Gpio_PWM_Init();
- Gpio_M_Init();
- while(flag==1)
- {
- flag=0;
- straight();//直走
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
- TurnLeft();//左转
- delay_ms(1000);
- delay_ms(500);
- straight();
- delay_ms(1000);
- TurnRight();
- delay_ms(1000);
- delay_ms(500);
- straight();
- delay_ms(500);
- TurnRight();
- delay_ms(1000);
- straight();
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
-
- // /* 回到中线 */
- //
- // TurnLeft(1.5);
- // straight(0.5);
- // TurnLeft(0.5);
- // straight(4);
- // /* 回到中线 */
- //
- // TurnRight(1.5);
- // straight(0.5);
- // TurnRight(1);
- // straight(2);
- //
- // /* 回到中线 */
- //
- // TurnLeft(1.5);
- // straight(0.5);
- // TurnLeft(1);
- // straight(2);
- // sternway(1);
-
- TimCounterInit(PWM_A_OFF,PWM_B_OFF);
- }
- }
- void TurnLeft()
- {
- IN1_H IN2_L
- IN3_H IN4_L
- A=500;
- B=800;
- TimCounterInit(A,B);
- }
- void TurnRight(void)
- {
- IN1_H IN2_L
- IN3_H IN4_L
- A=800;
- B=500;
- TimCounterInit(A,B);
- }
- void straight(void)
- {
- IN1_H IN2_L
- IN3_H IN4_L
- A=600;
- B=600;
- TimCounterInit(A,B);
- }
- void sternway(void)
- {
- IN1_L IN2_H
- IN3_L IN4_H
- A=700;
- B=700;
- TimCounterInit(A,B);
- }
- void Gpio_PWM_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- //以下设定是将TIM2的通道1(PA0)的复用功能打开,这很重要很容易被忘掉
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_PWM_A|GPIO_PWM_B; //选择led1
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //模式为复用推挽输出
- GPIO_Init(GPIO_PWM, &GPIO_InitStructure); //初始化led1寄存器
- }
- void Gpio_M_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_IN1|GPIO_Pin_IN2|GPIO_Pin_IN3|GPIO_Pin_IN4; //选择led1
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIO_IN, &GPIO_InitStructure); //初始化led1寄存器
- }
- /********************************************************************************************
- *函数名称:void TimCounterInit(void)
- *功能说明:TIM计数初始化配置
- * TIMCLK = 72 MHz, Prescaler = TIM_PSC, TIM counter clock = TIMCLK/TIM_COUNTER MHz
- *******************************************************************************************/
- void TimCounterInit(int rate_1,int rate_2) //rate可以改变占空比
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /* TIM时钟使能 */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- /* 基定时器初始化 */
- TIM_TimeBaseStructure.TIM_Period = 1000000*0.001; //计数值 1000;须介于0~65535
- TIM_TimeBaseStructure.TIM_Prescaler = 72; //分频系数,为了设定值数值较大,这里选得较小
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割:计数模式中无作用
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式,向上计数
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数值
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化TIM
-
- /* PWM1 Mode configuration: Channel1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式设定
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出模式使能
- TIM_OCInitStructure.TIM_Pulse = rate_1; //设置占空比,0时全低电平,1001时全高电平.须介于0~65535
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性;最终输出值是高/低电平
-
- TIM_OC1Init(TIM2, &TIM_OCInitStructure);//输出通道x,参数写入
- TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能通道x预装载寄存器
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式设定
- TIM_OCInitStructure.TIM_Pulse = rate_2; //设置占空比,0时全低电平,1001时全高电平.须介于0~65535
- TIM_OC2Init(TIM2, &TIM_OCInitStructure);//输出通道x,参数写入
- TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能通道x预装载寄存器
- TIM_Cmd(TIM2, ENABLE); //使能TIM
- }
复制代码
所有资料51hei提供下载:
1.PWM调速电机控制(6.10).rar
(279.69 KB, 下载次数: 300)
|