Stm32f103c8t6(proteus仿真)学习

您所在的位置:网站首页 proteus软件仿真设置元件参数的原因 Stm32f103c8t6(proteus仿真)学习

Stm32f103c8t6(proteus仿真)学习

2024-03-28 05:53| 来源: 网络整理| 查看: 265

目录 **一、proteus原理图绘制****二、代码的编写****1. IC.c文件****2. IC.h文件****3. PWM.c文件****4. PWM.h文件****5. main.c文件****6. 效果展示** **三、项目(代码+仿真)分享链接**

一、proteus原理图绘制

PWMI模式测量频率和占空比,原理图如下 在这里插入图片描述 这里使用TIM3 CH1产生PWM信号,使用TIM2 CHI输入捕获PWM信号 对应引脚是 TIM3 CH1:PA6;TIM2 CH1:PA0

二、代码的编写 1. IC.c文件

此文件是用来配置输入捕获模式的 使用 TIM2 CH1:PA0

#include "IC.h" void IC_Init(void) //输入捕获初始化函数 { //GPIO的结构体定义,定义一个GPIO类型的结构体,名字为GPIO_InitStructure GPIO_InitTypeDef GPIO_InitStructure; //TIM_TimeBase的结构体定义,定义一个TIM_TimeBase类型的结构体,名字为TIM_TimeBaseInitStructure TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //TIM_IC的结构体定义,定义一个TIM_IC类型的结构体,名字为TIM_ICInitStructure TIM_ICInitTypeDef TIM_ICInitStructure; //开启定时器2的时钟,注意是APB1(GPIO的是APB2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启GPIO的时钟,注意是APB2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //输入捕获引脚的定义,TIM2 CH1 --> 对应 PA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置引脚为上拉模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚速度 GPIO_Init(GPIOA, &GPIO_InitStructure); //PA0 //选择定时器的内部时钟源 TIM2 TIM_InternalClockConfig(TIM2); //配置定时器时基单元:TIM_TimeBase //选择时钟分频,可以选择1分频、2分频和4分频 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择1分频 //选择定时器计数方式,可选择向上计数、向下计数、中心对齐计数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM_CounterMode_Up:向上计数 /* 因为改变ARR的值会影响频率和占空比,改变PSC的值只会影响频率。所以选择ARR的值固定不变,修改PSC来改变频率 */ //设置ARR,即定时器周期:TIM_Period,取值0-65535 TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; //ARR设置为最大取值,65535 //设置PSC,即定时器预分频器的值:TIM_Prescaler,取值0-65535 TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC //高级定时器才用的到,重复计算器,先用不上赋值为0 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //定时器TIM2的时基单元 TIM_TimeBase 初始化 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //初始化配置定时器输入捕获单元:TIM_IC //选择输入捕获的通道(4个通道可选IM_Channel_X,X可选1-4) TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //TIM_Channel_1:通道1,TIM2通道1 对应 PA0 //设置输入捕获的滤波器的参数,取值0x0到0xF,取值越大,滤波效果越好 TIM_ICInitStructure.TIM_ICFilter = 0xF; //选择滤波参数为0xF //选择输入捕获的极性,(上升沿触发、下降沿触发、上升沿和下降沿都触发) TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //TIM_ICPolarity_Rising:上升沿触发 //设置输入捕获的时钟分频,可以选择1分频、2分频和4分频 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //TIM_ICPSC_DIV1:1分频 //设置输入捕获触发信号的输入选择,(可选择直连通道 和 交叉通道 等) TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM_ICSelection_DirectTI:直连通道 //配置PWMI模式 TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); //此语句自动配置与上方通道相反的配置 //与下面等效:通道1对应通道2,通道2对应通道1;上升变下降,下降变上升;直连通道变成交叉通道 //TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //TIM_ICInitStructure.TIM_ICFilter = 0xF; //选择滤波参数为0xF //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //TIM_ICPolarity_Falling:下降沿触发 //TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //TIM_ICPSC_DIV1:1分频 //TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI; //TIM_ICSelection_IndirectTI:交叉通道 //设置输入捕获的触发源(有8个触发源可以选择) TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //选择触发源:TIM_TS_TI1FP1 //设置从模式为Reset TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //启动TIM2定时器,使能TIM2 TIM_Cmd(TIM2, ENABLE); } uint32_t IC_GetFreq(void) //计算输入捕获的频率函数 { //测周法:Fs = Fc/N // Fc = 72M/(PSC+1),代入PSC=72得Fc=1M // N就是读取CCR(比较值寄存器)的值,使用TIM_GetCapture1(TIM2) return 1000000 / (TIM_GetCapture1(TIM2) + 1); //测周法:Fs = Fc/N,适用于低频信号 } uint32_t IC_GetDuty(void) //计算输入捕获的占空比 { return (TIM_GetCapture2(TIM2) + 1) * 100 / (TIM_GetCapture1(TIM2) + 1); } 2. IC.h文件 #ifndef __IC_H #define __IC_H #include "stm32f10x.h" // Device header void IC_Init(void); uint32_t IC_GetFreq(void); uint32_t IC_GetDuty(void); #endif 3. PWM.c文件

配置PWM(TIM3 CH1:PA6)

#include "PWM.h" void PWM_Init(void) //PWM初始化 { //GPIO的结构体定义,定义一个GPIO类型的结构体,名字为GPIO_InitStructure GPIO_InitTypeDef GPIO_InitStructure; //TIM_TimeBase的结构体定义,定义一个TIM_TimeBase类型的结构体,名字为TIM_TimeBaseInitStructure TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //TIM_OC的结构体定义,定义一个TIM_OC类型的结构体,名字为TIM_OCInitStructure TIM_OCInitTypeDef TIM_OCInitStructure; //开启定时器3的时钟,注意是APB1(GPIO的是APB2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启GPIO的时钟,注意是APB2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //选择定时器的内部时钟源 TIM3 TIM_InternalClockConfig(TIM3); //配置定时器时基单元:TIM_TimeBase //选择时钟分频,可以选择1分频、2分频和4分频 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM_CKD_DIV1:1分频 //选择定时器计数方式,可选择向上计数、向下计数、中心对齐计数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM_CounterMode_Up:向上计数 //设置ARR,即定时器周期:TIM_Period,取值0-65535 TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR //设置PSC,即定时器预分频器的值:TIM_Prescaler,取值0-65535 TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //PSC //高级定时器才用的到,重复计算器,先用不上赋值为0 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //TIM_TimeBase初始化 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //初始化配置定时器输出比较单元:TIM_OC //设置输出比较的模式:TIM_OCMode_PWM1,PWM1模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //设置输出比较的极性:TIM_OCPolarity_High;高极性:有效电平为高电平 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置输出使能 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设置捕获比较寄存器 CCR 的值 TIM_OCInitStructure.TIM_Pulse = 0; //CCR //初始化定时器3通道1 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能定时器3 TIM_Cmd(TIM3, ENABLE); } void PWM_SetCompare1(uint16_t Compare) { TIM_SetCompare1(TIM3, Compare); //设置捕获比较寄存器 CCR 的值 } void PWM_SetPrescaler(uint16_t Prescaler) //设置PSC的值 { TIM_PrescalerConfig(TIM3, Prescaler, TIM_PSCReloadMode_Immediate); //TIM_PSCReloadMode_Immediate:立即生效 } 4. PWM.h文件 #ifndef __PWM_H #define __PWM_H #include "stm32f10x.h" // Device header void PWM_Init(void); void PWM_SetCompare1(uint16_t Compare); void PWM_SetPrescaler(uint16_t Prescaler); //设置PSC的值 #endif 5. main.c文件 #include "stm32f10x.h" #include "OLED.h" //OLED显示屏 #include "PWM.h" //PWM输出 #include "IC.h" //输入捕获 #include "delay.h" int main(void) { delay_init(); OLED_Init(); //OLED初始化 PWM_Init(); IC_Init(); //输入捕获初始化 PA0,TIM2通道1 OLED_ShowString(1, 1, "Freq:00000Hz"); OLED_ShowString(2, 1, "Duty:00%"); PWM_SetPrescaler(720 - 1); //频率Freq = 72M / (PSC + 1) / 100 PWM_SetCompare1(50); //占空比Duty = CCR / 100 while(1){ OLED_ShowNum(1, 6, IC_GetFreq() , 5); OLED_ShowNum(2, 6, IC_GetDuty(), 2); } } 6. 效果展示

PWMI模式测量频率和占空比,效果如下 在这里插入图片描述

三、项目(代码+仿真)分享链接

百度网盘 链接:https://pan.baidu.com/s/1pcVtAcER2mAwnQnyRL3aXQ 提取码:p8q4



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3