由於是新申請的博客,因此申請了總想往裏面加點東西,因此把我以前在機智雲寫的帖子複製了過來php
(各位抱歉,因爲以前上傳的文件可能有錯誤,以前上傳的文件PWM不能用,那麼我又從新上傳了一個文件,這個文件的PWM加載到電機上了,以前的電機正反轉功能沒有了,有錯誤的文件我也沒刪除你們對照着看下吧!)前些陣子在機智雲上發了一個二次開發點亮LED的帖子,看的人不少,也有不少加我QQ諮詢的,本次在這裏在介紹一下 基於gokit2.0 STM32底板 PWM開發過程。
本人QQ 522414928 (void loop)
phone 13473465975 (打廣告了哈,其實我也不是啥名人,就是分享一下個人開發過程,但願對看過個人帖子的人有幫助)
廢話很少說,下面開始 個人分享
須要的東西 gokit 2.0 stm32底板 (其餘的開發板用戶也能夠看看個人程序及過程,而後看看能不能移植,c語言好的話沒問題的)
1 首先第一步 建立新產品 (個人是建好的哈,你們應該都明白,方案選的是wifi,產品分類產品名稱都本身看着弄就行)
這是我建好的那個 看下圖
2 第二部 就比較關鍵了建立數據點,我建了不少哈,由於我把 12個外部引用的引腳都開發了,雖然不知道接什麼設備 好了,看下圖就明白了
這個也是我以前建好的,你們看明白
3 第三部 原本應該是手機端軟件「機智雲」掃碼查看虛擬設備有沒有錯誤,(其實這是沒必要要的,由於我認爲是不會出錯的,手機跟雲端必定是對應的)
仍是說說必要的,必要的就是進入MCU開發選項,而後生成並下載代碼
具體以下:
下載完以後解壓,解壓後是這樣的
4 第四部 用keil 5軟件 打開project 文件夾下的 這個文件:
這個是project 文件夾
打開以後,是這樣的,看圖 ok,就是這樣
5 最最關鍵步驟來了,其實下載的這個程序只是個框架,還須要咱們填程序的
首先,咱們新建兩個文件,PWM1.C 和PWM2.H (叫什麼你隨意,學過stm32的都懂)保存在Hal文件夾下的Hal_PWM1文件夾下,下面這樣
而後往裏面添加程序,看圖吧(圖片里程序不全,具體程序我就複製在這兩個程序下邊)
PWM1.C裏的
#include <math.h>
#include "Hal_PWM1/PWM1.h"
void tim3GpioConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ??????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void tim3ModeConfig(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 ccr1Val = 500;
u16 ccr2Val = 500;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = ccr1Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = ccr2Val;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
void PWM1Init(void)
{
tim3GpioConfig();
tim3ModeConfig();
PWM1Status(0);
}
void PWM1Control(uint8_t m1,uint8_t m2)
{
u16 temp = (MOTOR_ARR+1) / MOTOR_MAX;
TIM_SetCompare1(TIM3,m1*temp);
TIM_SetCompare2(TIM3,m2*temp);
}
void PWM1Status(motor_t status)
{
if(0 == status)
{
PWM1Control(0,0);
}
else
{
if(status > 0)
{
PWM1Control((abs(status)+5)*10, 0);
}
else
{
PWM1Control(0, (abs(status)+5)*10);
}
}
}
pwm1.h裏的
#ifndef _PWM1_H
#define _PWM1_H
#include <stdio.h>
#include "stm32f10x_gpio.h"
#define MOTOR_SPEED_RATIO 1
#define MOTOR_SPEED_ADDITION (-5)
#define MOTOR_SPEED_DEFAULT 0
#define MOT1 PBout(8)
#define MOT2 PBout(9)
#define MOTOR_ARR 899 //8kHZ
#define MOTOR_MAX 100
#define MOTOR_MAX1 -100
#define MOTOR_MIN 0
#ifdef MOTOR_16
typedef int16_t motor_t;
#else
typedef int8_t motor_t;
#endif
void PWM1Init(void);
void PWM1Status(motor_t status);
#endif
6 這段程序和頭文件佔了帖子的很大地方啊,程序不太懂的加我QQ522414928,而後把它添加Hal這個裏面,看圖 添加進來以後能夠運行一下
7這一步就是添加程序初始化到 main.c 看圖更詳細 在main.c裏面 包含文件#include "Hal_PWM1/PWM1.h" 而後在void userInit(void) 這個函數裏面添加 PWM1Init()(按照個人來就能夠了,不懂得再問我)
8 這一步能夠算改程序的最後一步了,在gizwits_product.c 這個程序裏面找到case EVENT_PWM1: 而後在//user handle 前面加上一句程序 PWM1Status(PWM1Value); (警告,你的程序可能沒有EVENT_PWM1,這是根據你以前在數據點那起的名字所決定的)
程序到這裏就結束了,編譯程序,而後下載到開發板,下載都會吧,不會的問我,隨時在線,個人程序下載軟件是flymcu
感謝你看個人帖子,若是對你有幫助必定要謝謝我啊,畢竟這個帖子寫了兩個小時,本人渣渣一個,大的技術不會,但願各位大神誰有更好的建議留言 劉新宇的物聯網一.zip (8.72 MB, 下載次數: 0) html
這是帖子原地址框架
http://club.gizwits.com/forum.php?mod=viewthread&tid=4249&page=1#pid33626函數
二次開發點亮一個LED詳細過程:http://club.gizwits.com/forum.php?mod=viewthread&tid=4142&page=1#pid16838oop