当前位置: 首页 > news >正文

网站建设的目标定位网站的外链是怎么做的

网站建设的目标定位,网站的外链是怎么做的,二级网站开发 一级关系,优设网app下载1 输出比较 1.1 输出比较简介 OC#xff08;Output Compare#xff09;输出比较#xff1b;IC#xff08;Input Capture#xff09;输入捕获#xff1b;CC#xff08;Capture/Compare#xff09;输入捕获和输出比较的单元输出比较可以通过比较CNT与CCR寄存器值#…1 输出比较 1.1 输出比较简介 OCOutput Compare输出比较ICInput Capture输入捕获CCCapture/Compare输入捕获和输出比较的单元输出比较可以通过比较CNT与CCR寄存器值CCR捕获/比较寄存器的关系来对输出电平进行置1、置0或翻转的操作用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出的功能 主要是用来输出PWM波形的PWM波形又是驱动电机的必要条件。 这个CCR是共用的当使用输入捕获时它就是捕获寄存器当使用输出比较时它就是比较寄存器。在输出比较这里这块电路会比较CNT和CCR的值CNT计数自增CCR是我们给定的一个值当CNT大于CCR、小于CCR、等于CCR时输出就会置1置0置1置0这样就可以输出一个电平不断跳变的PWM波形了。 1.2 PWM简介 PWMPulse Width Modulation脉冲宽度调制 在具有惯性的系统中可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量常应用于电机控速等领域 PWM参数 频率 1 / TS            占空比 TON / TS           分辨率 占空比变化步距 1.3 输出比较通道 通用定时器的输出比较部分电路 对应的是 最后通过TIMx_CH1输出到GPIO引脚上。 左边是CNT计数器和CCR1第一路的捕获/比较寄存器它俩比较当CNT CCR1 或者 CNT CCR1时就会给输出模式控制器传一个信号然后输出模式控制器就会改变它输出OC1REFreference参考信号的高低电平接下来可以把OC1REF映射到主模式的TRGO输出上去不过REF的主要去向还是走下面。 这是一个极性选择给这个寄存器写0信号就会往上走就是信号电平不反转写1的话信号就会往下走信号会通过一个非门取反输出的信号就会发生反转。最后就是OC1引脚这个引脚是CH1通道的引脚在引脚定义中就可以具体知道是哪个GPIO了。 输出模式控制器的工作输出比较模式通过寄存器来配置。 模式 描述 冻结 CNTCCR时无效REF保持为原状态 匹配时置有效电平 CNTCCR时REF置有效电平高电平一次性的 匹配时置无效电平 CNTCCR时REF置无效电平低电平一次性的 匹配时电平翻转 CNTCCR时REF电平翻转 强制为无效电平 CNT与CCR无效REF强制为无效电平。在暂停期间保持高电平 强制为有效电平 CNT与CCR无效REF强制为有效电平。在暂停期间保持低电平 PWM模式1 向上计数CNTCCR时REF置有效电平CNT≥CCR时REF置无效电平 向下计数CNTCCR时REF置无效电平CNT≤CCR时REF置有效电平 PWM模式2 向上计数CNTCCR时REF置无效电平CNT≥CCR时REF置有效电平 向下计数CNTCCR时REF置有效电平CNT≤CCR时REF置无效电平 1冻结模式输出暂停 2匹配时置有效电平、匹配时置无效电平、匹配时电平翻转有效/无效电平一般是高级定时器的说法简单理解有效电平是高电平无效电平是低电平。 3PWM模式 PWM模式2是PWM模式1的取反。 1.4 PWM基本结构 左上角是时基单元和控制部分输出PWM暂时不需要中断。下面就是输出比较单元了总共有4路。输出比较单元的最开始是CCR捕获/比较寄存器CCR是我们自己设定的CNT不断自增运行同时它俩还在不断比较后面是输出模式控制器PWM模式1。 蓝色线是CNT的值黄色线是ARR的值CNT蓝色线从0开始自增一直增到ARR的值之后清零继续自增。在这个过程中再设置一条红线CCR的值之后再执行【CNTCCR时REF置有效电平CNT≥CCR时REF置无效电平】下面绿色部分是输出。 CNTCCR时REF置有效电平CNT≥CCR时REF置无效电平。并且它的占空比是受CCR值调控的如果CCR设置高一些输出占空比就大一些。 1.5 参数计算 PWM频率  Freq CK_PSC / (PSC 1) / (ARR 1) 对应着计数器的一个溢出更新周期PWM的频率等于计数器的更新频率。 PWM占空比  Duty CCR / (ARR 1) PWM分辨率  Reso 1 / (ARR 1) 输出一个频率为1KHz占空比可以任意调控切分辨率为1%的PWM波形 Reso 1 / (ARR 1) 1% 》ARR 99 Duty CCR / (ARR 1) CCR / 100  》 CCR [0, 100] Freq CK_PSC / (PSC 1) / (ARR 1) 1000 》 CK_PSC / (PSC 1) 100000 1.6 舵机简介 舵机是一种根据输入PWM信号占空比来控制输出角度的装置 输入PWM信号要求周期为20ms高电平宽度为0.5ms~2.5ms 大概的执行逻辑PWM信号输入到控制板给控制板一个指定的目标角度然后电位器会检测输出轴的当前角度如果大于目标角度电机就会反转否则正转。最终使输出轴固定在指定角度。 1.6.1 舵机硬件电路 1.7 直流电机 直流电机是一种将电能转换为机械能的装置有两个电极当电极正接时电机正转当电极反接时电机反转 直流电机属于大功率器件GPIO口无法直接驱动需要配合电机驱动电路来操作 TB6612是一款双路H桥型的直流电机驱动芯片可以驱动两个直流电机并且控制其转速和方向 1.7.1 硬件电路 看图和引脚说明很清晰。 STBY引脚是待机控制引脚。如果接GND芯片就不工作处于待机状态如果接逻辑电源VCC芯片就正常工作。 看手册 强置输出模式CNT和CCR无效REF强制为高和低的那两种模式 输出比较模式CNTCCR时REF冻结、置高、置低、反转那四种模式 PWM 模式CNT CCR或者CNT CCR时REF置高或者置低的那两种模式。 2 TIM输出比较之PWM驱动LED呼吸灯 2.1 接线图 注意这里高电平点亮低电平熄灭。即占空比越大LED越亮占空比越小LED越暗。 2.2 封装模块 按这个流程图进行初始化 先看输出比较相关的函数 // 这4个函数是用来配置输出比较的 void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);// 用来给输出比较结构体赋值一个默认值的 void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);// 仅高级定时器使用,在使用高级定时器输出PWM时,需要用这个函数使能主输出否则PWM将不能正常输出 void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);// 用来配置强制输出模式的。强制输出高电平和输出设置100%占空比一样 void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);// 配置CCR寄存器的预装功能就是影子寄存器写入的值不会立即生效在更新事件才会生效 void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);// 配置快速使能的 void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);// 外部事件时清除ref信号 void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);// 单独设置输出比较极性的 void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);// 单独修改输出使能参数的 void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);// 选择输出比较模式 void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);// 单独更改RCC寄存器的值 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); 要掌握的 // 这4个函数是用来配置输出比较的 void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);// 单独更改RCC寄存器的值 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); 看这个图 有TIM2_CH1_ETR在PA0这一行说明TIM2的ETR引脚和通道1的引脚都是借用了PA0引脚换句话TIM2的引脚复用到了PA0引脚上所以如果要使用TIM2的OC1也就是CH1t通道输出PWM那它就只能在PA0的引脚输出不能任意接。同样TIM2的CH2对应PA1。。。。。。 还可以修改 计算频率1kHz占空比50% 分辨率为1%。 PWM分辨率    Reso 1 / (ARR 1) 1%                                          ARR 100 - 1 PWM占空比    Duty CCR / (ARR 1) 50%                                    CCR 50 PWM频率    Freq CK_PSC(72M) / (PSC 1) / (ARR 1) 1K       PSC 720 - 1 // 2配置时基单元(预分频器、自动重装器、计数模式等)// ...TIM_TimeBaseInitStructure.TIM_Period 100 - 1; // ARR自动重装器的值 两个合起来计数0.1秒TIM_TimeBaseInitStructure.TIM_Prescaler 720 - 1; // PSC预分频器的值720分频得到100k计数TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);// 3配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure); // 先初始化后面再按需修改// ...TIM_OCInitStructure.TIM_Pulse 0; // CCR的值w为50先设置为0后面变化// 这个函数的选择按照GPIO口需求来PA0口对应的是第一个输出比较通道TIM_OC1Init(TIM2, TIM_OCInitStructure); PWM.c #include stm32f10x.h // Device header// PWM初始化函数 void PWM_Init(void) {// 1RCC开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);// 2配置时基单元(预分频器、自动重装器、计数模式等)TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频影响不大TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 计数模式向上计数TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器的值// 关键参数TIM_TimeBaseInitStructure.TIM_Period 100 - 1; // ARR自动重装器的值 两个合起来计数0.1秒TIM_TimeBaseInitStructure.TIM_Prescaler 720 - 1; // PSC预分频器的值720分频得到100k计数TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);// 3配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure); // 先初始化后面再按需修改TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // 输出比较模式,PWM模式1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 输出比较极性高级性极性不反转有效电平是高电平TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; // 输出状态输出使能TIM_OCInitStructure.TIM_Pulse 0; // CCR的值w为50先设置为0后面变化// 这个函数的选择按照GPIO口需求来PA0口对应的是第一个输出比较通道TIM_OC1Init(TIM2, TIM_OCInitStructure);// 频率1kHz占空比50% 分辨率为1%。 CCR 50 ,/**PWM分辨率 Reso 1 / (ARR 1) 1% ARR 100 - 1PWM占空比 Duty CCR / (ARR 1) 50% CCR 50PWM频率 Freq CK_PSC(72M) / (PSC 1) / (ARR 1) 1K PSC 720 - 1*/// 4配置GPIO(初始化为复用推挽输出参考引脚定义表)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出。定时器控制引脚输出控制权转移给片上外设GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);// 5运行控制启动计数器TIM_Cmd(TIM2, ENABLE); }// 更改通道1的CCR值 void PWM_SetCompare1(uint16_t Compare) {TIM_SetCompare1(TIM2, Compare); }2.3 主函数 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include PWM.huint8_t i;int main() {OLED_Init(); // 初始化OLEDPWM_Init(); // PWM初始化OLED_ShowString(1, 1, Hello);while (1){// 点亮for (i 0; i 100; i){PWM_SetCompare1(i);Delay_ms(10);}// 熄灭for (i 0; i 100; i) {PWM_SetCompare1(100 - i);Delay_ms(10);}} }现象接在PA0号口的灯如呼吸一般亮灭 复用到PA15 PWM.c #include stm32f10x.h // Device header// PWM初始化函数 void PWM_Init(void) {// 1RCC开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 重映射使用AFIOGPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); // 部分重映射PA15GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 解除调试端口// 2配置时基单元(预分频器、自动重装器、计数模式等)TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频影响不大TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 计数模式向上计数TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器的值// 关键参数TIM_TimeBaseInitStructure.TIM_Period 100 - 1; // ARR自动重装器的值 两个合起来计数0.1秒TIM_TimeBaseInitStructure.TIM_Prescaler 720 - 1; // PSC预分频器的值720分频得到100k计数TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);// 3配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure); // 先初始化后面再按需修改TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // 输出比较模式,PWM模式1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 输出比较极性高级性极性不反转有效电平是高电平TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; // 输出状态输出使能TIM_OCInitStructure.TIM_Pulse 0; // CCR的值w为50先设置为0后面变化// 这个函数的选择按照GPIO口需求来PA0口对应的是第一个输出比较通道TIM_OC1Init(TIM2, TIM_OCInitStructure);// 频率1kHz占空比50% 分辨率为1%。 CCR 50 ,/**PWM分辨率 Reso 1 / (ARR 1) 1% ARR 100 - 1PWM占空比 Duty CCR / (ARR 1) 50% CCR 50PWM频率 Freq CK_PSC(72M) / (PSC 1) / (ARR 1) 1K PSC 720 - 1*/// 4配置GPIO(初始化为复用推挽输出参考引脚定义表)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出。定时器控制引脚输出控制权转移给片上外设 // GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Pin GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);// 5运行控制启动计数器TIM_Cmd(TIM2, ENABLE); }// 更改通道1的CCR值 void PWM_SetCompare1(uint16_t Compare) {TIM_SetCompare1(TIM2, Compare); }3 TIM输出比较之PWM驱动舵机 3.1 接线图 注意颜色 3.2 模块封装 输入PWM信号要求周期为20ms高电平宽度为0.5ms~2.5ms // 输入PWM信号要求周期为20ms(50Hz)高电平宽度为0.5ms~2.5ms,占空比[2.5%, 12.5%]/**PWM分辨率 Reso 1 / (ARR 1)PWM占空比 Duty CCR / (ARR 1)PWM频率 Freq CK_PSC(72M) / (PSC 1) / (ARR 1)PSC 72 - 1ARR 20000 - 1CCR的范围是[500, 2500]*/ 现在使用的是PA1的通道2 PWM.c #include stm32f10x.h // Device header// PWM初始化函数 void PWM_Init(void) {// 1RCC开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);// 2配置时基单元(预分频器、自动重装器、计数模式等)TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频影响不大TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 计数模式向上计数TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器的值// 关键参数TIM_TimeBaseInitStructure.TIM_Period 20000 - 1; // ARR自动重装器的值 两个合起来计数0.1秒TIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1; // PSC预分频器的值72分频得到100k计数TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);// 3配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure); // 先初始化后面再按需修改TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // 输出比较模式,PWM模式1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 输出比较极性高级性极性不反转有效电平是高电平TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; // 输出状态输出使能TIM_OCInitStructure.TIM_Pulse 0; // CCR的值w为50先设置为0后面变化// 这个函数的选择按照GPIO口需求来PA1口对应的是第二个输出比较通道TIM_OC2Init(TIM2, TIM_OCInitStructure);// 输入PWM信号要求周期为20ms(50Hz)高电平宽度为0.5ms~2.5ms,占空比[2.5%, 12.5%]/**PWM分辨率 Reso 1 / (ARR 1)PWM占空比 Duty CCR / (ARR 1)PWM频率 Freq CK_PSC(72M) / (PSC 1) / (ARR 1)PSC 72 - 1ARR 20000 - 1CCR的范围是[500, 2500]*/// 4配置GPIO(初始化为复用推挽输出参考引脚定义表)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出。定时器控制引脚输出控制权转移给片上外设GPIO_InitStructure.GPIO_Pin GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);// 5运行控制启动计数器TIM_Cmd(TIM2, ENABLE); }// 更改通道2的CCR值 void PWM_SetCompare2(uint16_t Compare) {TIM_SetCompare2(TIM2, Compare); }Servo.c #include stm32f10x.h // Device header #include PWM.h// 舵机模块 void Servo_Init(void) {PWM_Init(); // 初始化PWM模块 }// 设置舵机角度。即改CCR的值 void Servo_SetAngle(float angle) {// 0° 500// 180 2500PWM_SetCompare2(angle / 180 * 2000 500); }3.3 主函数 #include stm32f10x.h // Device header #include Delay.h #include Key.h #include OLED.h #include Servo.huint8_t keyNum; float angle;int main() {OLED_Init(); // 初始化OLED_ShowString(1, 1, angle:); // 显示字符串Servo_Init();KEY_Init();while (1){keyNum KEY_GetNum(); // 读按键if (keyNum 1){angle 30;if (angle 180){angle 0;}}Servo_SetAngle(angle); // 设置舵机角度(设置CCR的值)OLED_ShowNum(1, 7, angle, 3);} }现象按按键舵机从0°开始每次转动30°当大于180°时回到0° 输入PWM信号要求周期为20ms高电平宽度为0.5ms~2.5ms 通过修改CCR的值改变占空比进而输出不同占空比的PWM波形。 4 TIM输出比较之PWM驱动直流电机 4.1 接线图 4.2 模块封装 电机接到了通道3上 PWM.c #include stm32f10x.h // Device header// PWM初始化函数 void PWM_Init(void) {// 1RCC开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);// 2配置时基单元(预分频器、自动重装器、计数模式等)TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频影响不大TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 计数模式向上计数TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器的值// 关键参数TIM_TimeBaseInitStructure.TIM_Period 100 - 1; // ARR自动重装器的值 两个合起来计数0.1秒TIM_TimeBaseInitStructure.TIM_Prescaler 36 - 1; // PSC预分频器的值36分频TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);// 3配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure); // 先初始化后面再按需修改TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // 输出比较模式,PWM模式1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 输出比较极性高级性极性不反转有效电平是高电平TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; // 输出状态输出使能TIM_OCInitStructure.TIM_Pulse 0; // CCR的值w为50先设置为0后面变化// 这个函数的选择按照GPIO口需求来PA2口对应的是第一个输出比较通道TIM_OC3Init(TIM2, TIM_OCInitStructure);// 频率1kHz占空比50% 分辨率为1%。 CCR 50 ,/**PWM分辨率 Reso 1 / (ARR 1) 1% ARR 100 - 1PWM占空比 Duty CCR / (ARR 1) 50% CCR 50PWM频率 Freq CK_PSC(72M) / (PSC 1) / (ARR 1) 1K PSC 720 - 1*/// 4配置GPIO(初始化为复用推挽输出参考引脚定义表)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出。定时器控制引脚输出控制权转移给片上外设GPIO_InitStructure.GPIO_Pin GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);// 5运行控制启动计数器TIM_Cmd(TIM2, ENABLE); }// 更改通道1的CCR值 void PWM_SetCompare3(uint16_t Compare) {TIM_SetCompare3(TIM2, Compare); }Motor.c #include stm32f10x.h // Device header #include PWM.h// 电机初始化 void Motor_Init(void) {// 还有两个角需要初始化控制电机方向RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);// 初始化PWMPWM_Init(); }// 设置速度函数 void Motor_Speed(int8_t speed) {// 正转if (speed 0){// 设置方向GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_5);// 速度RCC的值即调节占空比PWM_SetCompare3(speed);}else{// 设置方向GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_5);// 速度RCC的值即调节占空比PWM_SetCompare3(-speed);}} 4.3 主函数 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Motor.h #include Key.huint8_t keyNum; int8_t speed;int main() {OLED_Init(); // 初始化OLEDOLED_ShowString(1, 1, Speed:);Motor_Init();KEY_Init();while (1){keyNum KEY_GetNum();if (keyNum 1){speed 20;if (speed 100){speed -100;}}Motor_Speed(speed);OLED_ShowSignedNum(1, 7, speed, 3);} }
http://www.zqtcl.cn/news/144848/

相关文章:

  • 建设部网站举报壹搜网站建设优化排名
  • 做软件界面的网站洛可可成都设计公司
  • 微信建立免费网站app网站制作软件
  • 上海工程建设造价信息网站黑帽seo易下拉霸屏
  • 网站建设公司需要申请icp吗网站续费
  • 宁波快速建站公司滕州网站设计
  • logo成品效果图网站网站意见反馈源码
  • 宁志网站两学一做高端网站建设代码
  • 企业做可信网站认证的好处电影网站制作
  • 大学网站建设课程课综温州网站推广好不好
  • 做电影ppt模板下载网站有什么网站可以做海报
  • 搭建网站需要做什么国外互动网站
  • 淘宝客导购网站怎么做建设网站天河区
  • 做网站的优势有哪些wordpress 一直崩溃
  • 长沙交互网站设计服务商优秀的网页网站设计
  • android 旅游网站开发有哪些做伦敦金的网站
  • 物流网站系统php源码seo课程多少钱
  • 手机 网站品牌网站建设 d磐石网络
  • 免费用搭建网站珠海住房和建设局网站
  • 天津做胎儿鉴定网站广州古德室内设计有限公司logo
  • 做爰的最好看的视频的网站简洁型网页
  • 网站一直显示建设中网页制作工具程
  • 苏州seo网站管理网站后台更新后主页没有变化
  • 上海网站公司电话中国电子信息网
  • 合作网站seo在哪里建网站免费
  • 需求网站自动发卡网站开发
  • 用asp做网站span电子商务网站建设的教案
  • 厦门市住房建设网站音乐主题wordpress
  • 小说网站开发文档建站公司用wordpress
  • 自己做手机版网站制作佛山网站建设企划动力