这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【更新四轴姿态解算知识储备】snake0301四轴飞行器进程

共161条 2/17 1 2 3 4 5 6 ›| 跳转至
高工
2014-04-01 11:09:45     打赏
11楼
一起搞起。

高工
2014-04-01 12:30:44     打赏
12楼

给大家贡献一个延时函数

MCU:STN32F103C8

MCU配置:8M晶振,默认时钟配置,外设APB,GPIO速度50MHz

这个延时函数可以精确到1us

后期各种驱动必备

回复可见

——回复可见内容——


院士
2014-04-01 12:56:10     打赏
13楼
在回帖里加入 隐藏代码 回复帖子才能看到吧!

高工
2014-04-01 13:26:08     打赏
14楼
乔老板,你真坏。

高工
2014-04-01 18:49:32     打赏
15楼

串口通信

直接上代码


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
       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 USART1_Rx  */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

 端口配置代码

特别注意RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);



USART_InitStructure.USART_BaudRate = 115200;
  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_ClockInitStructure.USART_Clock = USART_Clock_Disable;     
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;      
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;      
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    USART_ClockInit(USART1, &USART_ClockInitStructure);
  USART_Init(USART1, &USART_InitStructure);
  USART_Cmd(USART1, ENABLE);
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 USART_Cmd(USART1, ENABLE);

 USART1的配置代码,通过2个结构体进行配置

和老版本外设库有些不一样


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

 中断配置代码


void USART1_IRQHandler(void) 
{ 
  while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
  {  }
  USART_SendData(USART1,USART_ReceiveData(USART1));
  USART_ClearFlag(USART1, USART_FLAG_RXNE);
}

 中断服务程序,RX接收数据,送串口调试助手显示

while (1)
  {
       printf("\r\n snake0301@电子产品世界四轴飞行器DIY!!! \r\n");
		delay_ms(500);
  }

 主函数部分


基本上就是循环发送"\r\n snake0301@电子产品世界四轴飞行器DIY!!! \r\n"

如果有数据接收,进入中断,并显示所接收到的字符。

视频伺候


视频地址:http://player.youku.com/player.php/sid/XNjkzMTAxODk2/v.swf


高工
2014-04-01 23:13:47     打赏
16楼

原理图上PWM是从PA0-PA3进行输出的

看了看的特西特,是TIM2的4路PWM

倒腾了一晚上,才把TIM2的PWM调通

着实扰人

上代码

void RCC_Configuration(void)
{
  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
}



时钟配置部分,看上去蛮简单。


GPIO_InitTypeDef GPIO_InitStructure;

  /*GPIOA Configuration: TIM2 channel1, 2, 3 and 4 */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO的配置,比较常规,不过要注意复用推挽输出的选择


void PWMchannel_config(int t1,int t2,int t3,int t4)
{
  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 665;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  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 = t1;
  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_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = t2;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = t3;
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = t4;
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM2, ENABLE);
}


四个PWM通道的配置,看上去眼花缭乱,其实大同小异


搞定一个,其他的基本上没有问题了

我这里申明了一个配置函数,为了能改变PWM的参数,来控制电机的转速



TIM_Cmd(TIM2, ENABLE);

  while (1)
  {
		PWMchannel_config(temp,temp+25,temp+50,temp+125);
		delay_ms(5000);
	if (temp>=250)
	{
		delay_ms(25000);
		temp=0;
  }
	else {temp=temp+50;}
  }


main函数主要的部分


上视频,有耳机,更清楚,吼吼。


视频地址:http://player.youku.com/player.php/sid/XNjkzMjQzNDI0/v.swf


高工
2014-04-01 23:16:06     打赏
17楼

经过几天的锻炼

小四轴被我折磨成这样了:

能坚持到最后么?


高工
2014-04-02 09:26:11     打赏
18楼
407Discovery怎么弄成尸体了?我的还好好的呢。。。。。。

高工
2014-04-02 09:27:17     打赏
19楼
STN32F103C8的FLASH太小了。 可以换成CB试试。固件可以直接刷

高工
2014-04-02 10:23:04     打赏
20楼
两块,其中一块尸体,哈哈。

共161条 2/17 1 2 3 4 5 6 ›| 跳转至

回复

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