这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » dawnjeanh的四轴飞行器进程

共14条 2/2 1 2 跳转至
菜鸟
2014-06-22 14:34:23     打赏
11楼

基础实验-UART串口通讯实验

给出关键函数

/************************************************************************\
*	函数名:USART1_Initialization
*	函数功能概述:串口1初始化
*	参数说明:baud-波特率
*	返回值说明:
\************************************************************************/
void USART1_Initialization(uint32_t baud)
{
	USART_InitTypeDef USART_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//使能时钟
	//PA9-TXD
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//PA10-RXD
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	
	USART_Init(USART1, &USART_InitStructure);
	USART_Cmd(USART1, ENABLE);
}

/************************************************************************\
*	函数名:USART1_SendByte
*	函数功能概述:串口1发送字节
*	参数说明:data-数据
*	返回值说明:
\************************************************************************/
void USART1_SendByte(uint8_t data)
{
	USART_SendData(USART1, data);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
	{}
}

 

主要是配置好IO复用,USART的波特率,数据位,停止位等等,就可以了


菜鸟
2014-06-27 15:06:00     打赏
12楼

基础实验-PWM电机驱动实验

PWM是电机驱动的基础,也是控制的基础。简单来说就是改变占空比来改变方波的等效电压,所以占空比越大,等效电压越大,电机也就转的越快。

下面给出配置代码


/************************************************************************\
*	函数名:TIM2_Initialization
*	函数功能概述:PWM初始化
*	参数说明:
*	返回值说明:
\************************************************************************/
void TIM2_Initialization(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	//PA0-1-2-3:PWM
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 100;
  TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((36000000 / 1000000) - 1);//1MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
	/* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
	/* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
	/* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC3Init(TIM2, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
	/* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC4Init(TIM2, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM2, ENABLE);
	
	TIM_Cmd(TIM2, ENABLE);
}

 

PWM是通过定时器模块产生的,首先配置定时器的基础部分,分频、计数模式、溢出值等等,在配置各个通道的输出方式,初始的比较值等等,因为是上电初始化,所以TIM_Pulse = 0;

通过TIM_SetCompare1等函数就可以改变通道的比较值,也就改变了PWM的占空比。

int main(void)
{
	int32_t i;
	Hardware_Initialization();
	
	USART1_SendStr(" QuadCopter DIY\r\n");
	
	while(1)
	{
		LED_Dx_ON();
		LED_D1_OFF();
		Wait_for(100);
		LED_Dx_OFF();
		LED_D1_ON();
		Wait_for(100);
		USART1_SendNum(i++);USART1_SendStr("\r\n");
		TIM_SetCompare1(TIM2, i % 30);
		TIM_SetCompare2(TIM2, i % 30);
		TIM_SetCompare3(TIM2, i % 30);
		TIM_SetCompare4(TIM2, i % 30);
	}
}

 



菜鸟
2014-06-27 15:10:09     打赏
13楼
关于电机控制用的PWM的频率以及对计数的细分我没有太多想法,我现在使用的是10KHz的PWM,最小改变1%的占空比,不知道这样的控制精度能不能达到要求?

菜鸟
2014-06-29 16:18:13     打赏
14楼

MPU6050的官方网站地址

http://www.invensense.com/mems/gyro/mpu6050.html

可以在上面下载数据手册还有寄存器地址(竟然还把两个分开,最开始下载数据手册里没有找到寄存器说明还很纳闷呢)


共14条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]