完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
自主学习STM32已有一周,先实现一个小demo,算是给自己一个动力叭,有目标的学习收获会更多。虽然本科也修了嵌入式课程,但那种走马观花式的学习,最后真正得到的知识实在寥寥无几。个人理解,学习STM32不只是学习编程,更多的是学习查资料、查数据手册、软件的使用和调试方法上,真正需要自己从头造的部分不是很多,吸取前人的经验,搬过来取自己所需即可。用农夫山泉的话来说就是,我们不生产代码,我们只是代码的搬运工!
这次主要跟着正点原子的开发资料进行学习,没有使用战舰开发板,而是使用STM32F103C8T6板子。一是避免自己直接把例程的代码烧进开发板,最后啥也没学到,在不同的板子间移植代码过程中,能够掌握理解更多的基础知识和调试经验;二是这个小板子廉价易得,只要十块钱,和大几百的开发板相比,它体积小、资源可观,很适合我的小项目,以后准备用来制作航模遥控器,敬请关注哈~ 1.材料清单 1.STM32F103C8T6蓝色开发板*1(黑色板也可以) 2.USB转TTL模块*1 3. ST-LINK V2仿真器下载器*1(调试STM32性价比极高) 4. OLED屏幕(4管脚)*1 5.10k电位器*1(10k以上都可) 6. 杜邦线、面包板、导线、插针若干 2.电路连接 电位器:GND - PA0 - 3.3V OLED显示屏: GND 电源地 VCC 接3.3v电源 SCL 接PB8(SCL) SDA 接PB9(SDA) ST-LINK V2接法: GND 电源地 3V3 接3.3v SWCLK 接DCLK SWDIO 接DIO 串口USB-TTL接法: GND 电源地 3V3 接3.3v TXD 接PB7 RXD 接PB6 PWM输出:PB5 实物连接图如下: 3.安装keil5 等待网页加载完,在列表里找到Keil,再找STMicroelectronics STM32F1 Series Device Support, Drivers and 4.新建工程 与链接里面不同的是以下几个设置: 点击图标按钮1,打开Manage Run-Time Environment窗口,Device如下勾选,其他栏与链接中相同; 点击图标按钮2,打开Manage Project Items窗口,Groups和 Files如下设置: 点击图标按钮3,打开Options for Target窗口,点击顶部菜单按钮切换子窗口,依次如下设置: 点击Setting,打开Cortex-M Target Driver Setup窗口,如果SWDIO里面未显示序列号,则电脑需要更新ST-LINK驱动。 5.程序实现 控制舵机的PWM:周期20ms,高电平时间0.5ms~2.5ms变化,可控制舵机0~180°的角度变化,即每个高电平时间都对应舵机的一个角度。但航模舵面的实际控制中,不可能有180°变化,所以通用的高电平宽度其实是1ms~2ms。 控制无刷电调所用的PWM信号高电平时间也是1ms~2ms,所以我们要实现的PWM信号周期20ms,高电平时间1ms~2ms。 我们使用ADC1读取电位器的电压采样值,并从0~4095范围的采样值转换到1000~2000,赋值给PWM输出。 TIM2定时触发ADC采样,通过DMA传输给变量所在的寄存器,取10次进行均值滤波,消除抖动。 TIM3定时触发产生PWM信号,预分频72,频率1MHz,周期1us;自动装载值20 000,故PWM周期1us*20 000=20ms。 主要代码如下: main.c文件-包含程序说明、主函数 /* =============舵机测试仪============== 芯片STM32F103C8T6,使用ADC读取电位器的电压采样值,0~4095转换到1000~2000,赋值给PWM输出。 TIM2定时触发ADC采样,通过DMA传输给变量ch1Value,取10次进行均值滤波。 控制舵机的PWM:周期20ms,高电平时间0.5ms~2.5ms变化,可控制舵机0~180°的角度变化, 但航模舵面的实际控制中,不可能有180°变化,所以通用的高电平宽度其实是1ms~2ms 电位器:GND - PA0 - 3.3V OLED显示屏: GND 电源地 VCC 接3.3v电源 SCL 接PB8(SCL) SDA 接PB9(SDA) 串口USB-TTL接法: GND 电源地 3V3 接3.3v TXD 接PB7 RXD 接PB6 ST-LINK V2接法: GND 电源地 3V3 接3.3v SWCLK 接DCLK SWDIO 接DIO PWM输出:PB5 by Bilibili 蔡子CaiZi */ #include “config.h” #include “delay.h” #include “usart.h” #include “stm32f10x.h” #include “oled.h” #include “rtc.h” #include “stdio.h” #include “string.h” int main() { u8 txt[16]={0}; delay_init();//初始化延时函数 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2,2位抢占优先级和2位子优先级 usart_init(115200);//初始化串口1,波特率为115200 TIM3_PWM_Init(19999,71);//预分频72,频率1MHz,周期1us;自动装载值20 000,故PWM周期1us*20 000 TIM2_Init(499,71);//1MHz,每500us采集一次;可设置9us以上,但过小影响OLED显示 DMA1_Init(); //DMA初始化 GPIOA_Init(); //PA初始化 Adc_Init(); //ADC初始化 RTC_Init(); //RTC初始化 OLED_Init(); //初始化OLED OLED_Clear(); while (1){ itoa(PWM1value,txt,10);//将int类型转换成10进制字符串 // printf(“采样值:%dt舵量:%st”,ch1Value,txt); // printf(“当前时间:%d:%d:%dn”,calendar.hour,calendar.min,calendar.sec); //OLED_Clear();//一直清屏会造成闪烁 strcat(txt,“ us”);//合并字符串 OLED_ShowString(6,3,txt,24); //位置6,3;字符大小24*24点阵 OLED_Refresh_Gram(); delay_ms(1); } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1804 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1097 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
736 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1686 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
583浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 00:44 , Processed in 0.923370 second(s), Total 73, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号