精华内容
下载资源
问答
  • STM32 IO口模拟PWM 方便移植 注释详细
  • MCU的IO口模拟PWM信号

    千次阅读 2020-08-26 10:39:36
    PWM的两个指标: 占空比和频率,普通的IO只要能控制高低电平变化就可以模拟PWM信号了。 什么叫占空比? 高电平时间占整个周期时间的比例叫占空比,比如一个周期为100ms,高电平部分占了40ms,那么占空比就是40%。 ...

    单片机的GPIO口可以产生PWM信号,可以使用定时器来实现。使用定时器控制GPIO口的高电平和低电平的翻转时间即可实现输出方波的频率控制占空比控制

    PWM的两个指标: 占空比和频率,普通的IO只要能控制高低电平变化就可以模拟PWM信号了。

    什么叫占空比?
    高电平时间占整个周期时间的比例叫占空比,比如一个周期为100ms,高电平部分占了40ms,那么占空比就是40%。

    什么叫频率?
    每秒种的周期数叫做频率,假如每秒产生50个波形,那么频率就是50Hz。

    IO口输出PWM信号的思路
    所谓PWM信号是指脉冲宽度调制信号,通过改变高电平持续时间和低电平持续时间实现信号的调节。如果单片机的GPIO口输出高电平持续的时间为1秒钟,然后输出低电平持续时间也是1秒钟,则该信号的周期就为2秒钟,占空比为50%。所以只需要改变高电平持续的时间或者低电平持续的时间,就可以实现脉冲宽度的调制。这里就需要用到定时器来控制GPIO口的定时翻转。

    在这里插入图片描述
    假设单片机输出高电平所持续的时间为T1,翻转为低电平后持续的时间为T2,那么周期就为T1+T2,占空比就为T1/(T1+T2),所以如果保持频率不变只改变占空比,就只修改T1,且保证T1+T2不变。但是因受MCU时钟和IO电平转换速度的限制,频率很高的PWM信号是没法用普通IO模拟,需要选用带PWM外设的MCU。

    PWM基本参数及用途
    PWM在使用时,具有两个非常重要的参数:频率/周期,占空比。前文提过占空比就是在一个周期中高电平所占用的比例,而频率和周期是互为倒数的。PWM信号非常有用,平时所讲的电机调速、电机驱动都是通过PWM来实现的。在PWM调速时,占空比越大电机转速越快,占空比越小电机转速越慢。占空比为100%时即为持续的高电平;为0%时即为持续的低电平。在BLDC驱动中,也通过PWM来控制电机的转动和调速。

    展开全文
  • PWM就是在固定的周期内,改变IO口高电平和低电平的维持时间。其中 占空比 = 高电平时间/周期时间。通过调节占空比,就可以改变led灯的亮度,通过控制三色灯的不同亮度(权重)来实现不同颜色的显示。 如果led灯不停...

    市面上有很多产品都是都运用到了PWM的功能,比方说动态变化各种颜色的背光灯,渐明渐暗的呼吸灯等产品。

    PWM就是在固定的周期内,改变IO口高电平和低电平的维持时间。其中 占空比 = 高电平时间/周期时间。通过调节占空比,就可以改变led灯的亮度,通过控制三色灯的不同亮度(权重)来实现不同颜色的显示。

    如果led灯不停的高低电平切换。我们看到的不应该是一直在闪烁的灯吗?其实不是的,有一种现象叫做视觉暂留:人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”。物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,同样的道理,在led亮起来的时候,然后让led短暂时间的熄灭,再亮起来,因为之前led亮的后像还没有消失,再次衔接led亮的动作,人眼就感觉不出led有过熄灭的动作。如果熄灭的时间超过了残留的后像时间人眼就会感觉到led闪烁。

    但是物理上led灯的确有过短暂的时间熄灭过,这就会导致led看起来亮度没有一直亮着的led灯亮。

    有些嵌入式芯片没有集成PWM功能,那么我们可以通过普通IO口模拟PWM功能。本文通过STM32硬件资源,通过普通IO口模拟PWM功能。代码也可以很容易移植到其他硬件平台。

    1. 需要的资源

    • 普通IO口
    • 一个定时器中断,满足固定时间执行一次的调节(这里我们设置成100us)

    2. 定义结构体

    typedef struct
    {
    	unsigned char Cycle;		/* 周期计时 周期 = 每次执行的中断时间*0xff */
    	unsigned char Duty;			/* 当前占空比 */
    	void (*IO_HIGH)(void);		/* 高电平函数 */
    	void (*IO_LOW)(void);		/* 低电平函数 */
    }PWM_CONFIG;
    

    3. 函数功能

    /*
    *********************************************************************************************************
    *	函 数 名: PWM_Control
    *	形    参: pwm
    *	返 回 值: 无
    *	功能说明:  周期计数Cycle从1到0xff,依次递增计时,每循环一次也就是一次周期完成,
    			   当设置的当前占空比大于等于当前的周期计数的时候,IO设置成高电平,否则设置成低电平。
    			   比方说,Duty设置成0x40,则Cycle 在[1,0x40]这范围内是高电平,[0x41,0xff]这范围内是低电平
    *********************************************************************************************************
    */
    void PWM_Control(PWM_CONFIG* pwm)
    {
    	if(pwm->Duty >= pwm->Cycle)
    		pwm->IO_HIGH();
    	else
    		pwm->IO_LOW();
    	
    	if(++pwm->Cycle >= 0xff)
    		pwm->Cycle = 1;
    }
    
    
    /*
    *********************************************************************************************************
    *	函 数 名: PWM_Handler
    *	形    参: 无
    *	返 回 值: 无
    *	功能说明: 将函数放在定时器中断里面,比方说100us的定时中断函数中,保证每100us调用一次
    *********************************************************************************************************
    */
    void PWM_Handler(void)
    {
    	PWM_Control(&pwm_red_config);
    	PWM_Control(&pwm_green_config);
    	PWM_Control(&pwm_blue_config);
    }
    
    
    
    /*
    *********************************************************************************************************
    *	函 数 名: PWM_SetColor
    *	形    参: red,红色占空比;green,绿色占空比;blue,蓝色占空比
    *	返 回 值: 无
    *	功能说明: 通过设置每个灯的占空比,来设置三色灯的颜色
    *********************************************************************************************************
    */
    void PWM_SetColor(unsigned char red, unsigned char green, unsigned char blue)
    {
    	pwm_red_config.Duty = red;
    	pwm_green_config.Duty = green;
    	pwm_blue_config.Duty = blue;
    }
    
    
    /*
    *********************************************************************************************************
    *	函 数 名: PWM_Init
    *	形    参: 无
    *	返 回 值: 无
    *	功能说明: PWM的IO配置,初始化函数
    *********************************************************************************************************
    */
    void PWM_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStruct;//定义GPIO结构体
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC的时钟
    	
    	GPIO_InitStruct.GPIO_Pin = LED_R_PIN;
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(LED_R_PORT,&GPIO_InitStruct);
    	
    	GPIO_InitStruct.GPIO_Pin = LED_G_PIN;
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(LED_G_PORT,&GPIO_InitStruct);
    	
    	GPIO_InitStruct.GPIO_Pin = LED_B_PIN;
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(LED_B_PORT,&GPIO_InitStruct);	
    }
    

    4. RGB颜色对照表

    通过调用函数PWM_SetColor,改变三个参数的占空比就可以实现,不同的颜色。可以参考RGB颜色对照表

    在这里插入图片描述

    5. 建议

    • 周期可以根据实际需要更改,这里我们设置的是100us*0xff
    • 实际运用中将三色灯,一直导通按理说应该是白色灯,但是实际情况可能会偏向其中一个颜色。比方说颜色偏红色,就把红的那一路通过加电阻减小电流或者软件调占空比减小,建议是在三色灯每个IO口串联一个电阻,用来调整亮度。
    • 如果实际产品是和音频有关的注意走线,防止PWM对模拟信号的干扰。

    6. 代码下载

    io口模拟PWM驱动程序提取码:vwh3

    我的个人博客网址:一个点的频率 希望大家关注一下,谢谢!!!

    展开全文
  • STM32普通io口模拟pwm输出的三种方法

    千次阅读 2021-05-05 15:51:05
    STM32F103RB普通io口模拟pwm输出的第三种方法(周期占空比可调)第(一)种定时器中断产生pwm`第(一)种代码片`第(二)种比较+周期中断`第(二)种代码片`第(三)种系统滴答定时器(这里和第一种原理一样,不作...

    第(一)种

    定时器中断产生pwm

    io口如何产生一个pwm???,无非就是做一个高低电平周期性的变化,这种思想很重要,确定频率就可以确定周期(T=1/f)也就是在一个周期内产生pwm的时间可以确定下来了,如何改变占空比???确定了时间,高电平的时间不就是想要的占空比么,比如要产生一个频率1khz,占空比为70%的pwm,根据频率我们知道了周期为1ms,产生一个占空比为70%的不就是0.7ms的时间给高电平么,(我们用定时器中断的方式,使0.1ms产生一次中断,计数中断次数,中断处理函数前七次中断都给高电平就ok了)


    第(一)种代码片

    //#include "stm32f10x.h"
    #include "stdio.h"
    #include "usart.h"
    #include "tim.h"
    #include "led.h"
    #include "misc.h"
    
    void TIM2_NVIC(void);
    void TIM2_Init(void);
    
    
    unsigned char ucLed;
    unsigned char ucLCK;
    
    
    
    
    int main(void)
    {
      SysTick_Config(72000);			// 定时1ms(HCLK = 72MHz)
      TIM2_Init();
    	TIM2_NVIC();
    	LED_Init();
     
    	while(1)
    		        { 
    				 LED_Disp(ucLed);
    				}
      
    }  
    
    
    //unsigned int count;
    //中断服务函数
    unsigned int count=0;
    unsigned int  i;
    void TIM2_IRQHandler(void) 
    {  count++;//计中断次数
    	
    	if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
    	{	
    	  if(count%10<i)//i:改变占空比值,这里i为变量,且让占空比一直变化
    		ucLed =0xff;//高电平
    		
    		else
    		ucLed =0;
    	
    	 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
     }
    }
    
    
    
     void TIM2_NVIC(void)
     {
      NVIC_InitTypeDef NVIC_InitStructure;
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断分组
      NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//设置TIM2中断
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级为0
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级为1
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断源
      NVIC_Init(&NVIC_InitStructure);
     }
    
    
    
     void TIM2_Init(void)//0.1ms定时
    {
    
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
     // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
      
      TIM_TimeBaseInitStruct.TIM_Prescaler = (2-1);//预分屏系数
      TIM_TimeBaseInitStruct.TIM_Period = (36000/10)-1;//自动重载计数周期值  
      TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置为向上计数方式
      TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数
      TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
      TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断
      TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能TIM2的更新中断
      TIM_Cmd(TIM2, ENABLE);//使能TIM2定时器
    }  
    
    
    
    //此函数必须有
    void SysTick_Handler(void)
    {
    	//ucLCK++;
    	if(ucLCK++%500==0)
    	{
    		i++;
    		if(i==10)
    		i=0;
    	}	
    }
    
    
    

    这里的i 是改变占空比的,设置为变量是让pwm增大减小循环,达到呼吸灯的效果,在定时器里面给i做了延时,是为了让它变化得不那么快,让实验现象更加明显

    第(二)种

    比较匹配+溢出中断

    第(二)种代码片

    /*
    ***************************************************
    实验功能:
    通过比较和溢出功能,模拟pwm输出,在PC8-PC15输出可变pwm
    ***************************************************
    */
    #include "stdio.h"
    #include "led.h"
    #include "misc.h"
    
     
     
     void TIM2_Config(uint16_t duty2);
     
     unsigned char ucLed;
     unsigned int Compare2=100;
     unsigned int ulTick;
    
     
     
    int main(void)
    {
      SysTick_Config(72000);			// 定时1ms(HCLK = 72MHz)
      TIM2_Config(999/4);     //25%
      TIM_SetCompare2(TIM2,Compare2);//直接调节占空比函数
      LED_Init();
    	
    while(1)
    
    
     { 
    	    if(ulTick%1000==0)
    					 {
    						Compare2+=50;
    						if(Compare2>999)
    						Compare2=100;
    							 
    						TIM_SetCompare2(TIM2,Compare2);
    					 }	
     }
    
    
    }  
    
    
    //输出比较
    void TIM2_Config(uint16_t duty1) //TIM2 CH2 
    {
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; 
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	
    	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	
    	
    	TIM_TimeBaseStructure.TIM_Period = 999;  //1KHz  //自动重装载值
    	TIM_TimeBaseStructure.TIM_Prescaler = 71;  //预分频系数
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //基本定时器配置
    	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断
    	TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//使能TIM2的更新中断
    	
    	TIM_PrescalerConfig(TIM2,71, TIM_PSCReloadMode_Immediate);	 //	TIM2  预分频值   预分频重载模式
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式,脉冲宽度调制模式2
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;//禁用比较输出功能
    	TIM_OCInitStructure.TIM_Pulse = duty1;//占空比
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//设置比较输出有效电平
    	TIM_OC2Init(TIM2, &TIM_OCInitStructure);//通道二
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能寄存器TIM_CCMR1
    	
    	
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断分组
    	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//设置TIM2中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级为0
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级为0
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断源
        NVIC_Init(&NVIC_InitStructure);
    	
    	TIM_Cmd(TIM2, ENABLE);//使能TIM2定时计数器
    }
    
    
    
    
    
    //中断处理函数
     void TIM2_IRQHandler(void) 
    {  
    	
    	if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)  //溢出中断
    	 {	
    	 ucLed = 0x00;  //关闭所有LED
    	 LED_Disp(ucLed);
    	 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    	 }
     else if(TIM_GetITStatus(TIM2,TIM_IT_CC2) != RESET) //比较匹配
    	 {
    	 ucLed = 0xff;//打开所有LED
    	 LED_Disp(ucLed);
    	 TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
    	 }
    }
     
     
     
     
    //此函数必须有
    void SysTick_Handler(void)
    {
    	ulTick++;
    }
    
    
    
    

    while循环里面也是为了改变占空比,达到呼吸灯的效果

    第(三)种

    系统滴答定时器(这里和第一种原理一样,不作讲解)

    完整工程下载>>GitHub

    选择第6个工程(两种方法都在里面)

    作者:江多多(在校学生)
    版权所有,欢迎保留原文链接进行转载:)
    不忘初心,牢记使命,励志成为一名优秀的嵌入式工程师! (我的第六篇博客)

    展开全文
  • STM32F429igt6 原野开发板 C++源代码 本代码采用STMcubeMX5.30和MDK5版本的开发环境,包含cubeMX工程文件和MDK5工程文件,arm嵌入式 C语言源代码 附开发环境的版本说明,STM32F429igt6/f767igt6/h743iit6原理图及...
  • STM单片机翻转I/O口模拟PWM波控制步进电机,可以控制方向,控制距离,控制速度
  • io模拟pwm,简单易用

    2019-07-10 10:31:17
    io模拟pwm,简单易用,可移植性高,使用可参考代码中的pwm_test()函数
  • 我的呼吸灯功能由2个函数实现,一个函数是IO模拟PWM产生波形;另一个函数是控制占空比的改变快慢及大小;他们之间用一个可更改的占空比变量联系; 可更改的占空比变量: volatileuint16_tpwm_duty=0u;//占空比 ...


    《《《《《正文》》》》》


     

    《硬件设计》

    控制灯的IO口接芯片即可;

     

    《软件架构》

     


     

    《软件设计》

    我的呼吸灯功能由2个函数实现,一个函数是IO模拟PWM产生波形;另一个函数是控制占空比的改变快慢及大小;他们之间用一个可更改的占空比变量联系;

    可更改的占空比变量:

    volatile uint16_t pwm_duty=0u;    //占空比

     

    1、设计IO模拟PWM波形函数

    该函数需要被周期调用,这样是为了可以对时间进行精确的计时,从而实现对占空比的控制,我选择100us的调用周期。

    呼吸灯PWM周期的选定,也就是频率,我选择200hz,也就是5ms的周期,可根据实际的情况改变频率,当然前提是不能太低,太低会使led出现明显的闪烁现象;

    根据上面100us的函数调用时间,实现5ms的周期的话需要周期计数值为50;这个数决定了你的PWM的可以分得的档次,如果是50,就只有50挡了,相当于最小改变占空比的数值为2%;如果是100,那就有100挡,最小改变占空比为1%;

    //PWM周期宏定义 跟调用周期有关#define  BREATH_LEDPWM_PERIOD     50u  // 调用周期*50 = 100us*50 =5ms

    具体函数:

    #define  BREATH_LEDPWM_PERIOD     50u  void Led_BreathFunction(void){  static uint16_t led_BreathPwmCnt = 0u;  led_BreathPwmCnt++;      if(led_BreathPwmCnt > pwm_duty) //占空比分界点  {      DOORLED_1;//用户实际操作IO电平  }  else  {    DOORLED_0; //用户实际操作IO电平  }    if(led_BreathPwmCnt >= BREATH_LEDPWM_PERIOD) //一个PWM周期完成  {    led_BreathPwmCnt=0u;  }  }

    当pwm_duty=25时,相对于周期计数值50,就是一半,即50%的占空比;本人实际测得的波形如下图:

    这里多说一句,我们会发现周期是5.013ms,多出了13us,这个就是我在《关于PWM的一些事》那篇文章说的,使用IO模拟PWM时,当高频率的时候,你不得不考虑IO操作电平时的时间,还有程序的运行时间;因此没特殊情况,不推荐使用IO口模拟PWM;本人也不推荐使用IO模拟PWM,所以我这里的程序也只是打个样,代码就不公布,需要的可以私下留言联系;后续会使用STM32的PWM模块实现呼吸灯,提供那一套代码;


    2、设计改变占空比函数

    决定呼吸快慢有2个因素,第一个因素是占空比改变的快慢,比如30ms或者40ms改变一次占空比;第二个因素是占空比改变的大小,比如一次改变占空比增加5%,或者10%等;

    因此同样的,这个函数需要对时间的计数,也需要周期性调用;我使用2ms调用;30ms改变一次占空比,每次占空比改变2%(对应到50的PWM周期计数值,那就是1,这里50最小改变占空比大小为2%);

     

    #define PwmChangePeriod   15  //占空比改变周期 调用周期*15 = 30ms#define PwmChangeDuty     1  //占空比改变大小  1/BREATH_LEDPWM_PERIOD = 2%void BreathLed_MainFunction(void){  static uint16_t Cnt_ = 0U; //改变占空比周期计数值  static uint8_t  breathFlag =TRUE; //占空比递加减状态标志:TRUE:递加 FALSE:递减  Cnt_++;  if(Cnt_>PwmChangePeriod ) //到达改变占空比的时间,30ms  {    Cnt_ = 0U;    if(breathFlag) //占空比递加状态,就是变亮    {      pwm_duty+=PwmChangeDuty; //改变占空比      if(pwm_duty>=BREATH_LEDPWM_PERIOD)  //加到最大占空比则进入递减状态      {        breathFlag=FALSE;       }    }    else//占空比递减操作 就是变暗    {      pwm_duty-=PwmChangeDuty;//改变占空比      if(pwm_duty==0U)//递减到最小占空比则进入递加状态      {        breathFlag=TRUE;      }    }  }  }

     

    《呼吸灯效果》

    效果可能不好,这跟PWM可以分的档位有关,以及占空比改变的快慢、占空比改变的大小都有关,这个自己需要根据实际调试参数;


     


    《《《《《END》》》》》

     

    展开全文
  • 也有朋友肯定会说直接使用PWM不就行了吗,如果单片机没有那么多PWM怎么办呢; 下面要聊的是一种三色的LED,三种基础颜色,红、绿、蓝;灯珠有三个IO口对应到单片机上面; 全0是灭灯;颜色变化有7种,分别是红、...
  • void GREEN_OFF() { /* 灭灯 */ } void GREEN_ON() { /* 点灯 */ } #define DUTY_RATE_NUM 44 #define DURATION_TIME 50 static uint8_t count = 0; // 小周期计时 static uint8_t count2 = 0;...
  • 【msm8953】gpio口模拟pwm详细步骤

    千次阅读 2019-09-26 11:07:40
    一丶简介 平台:msm8953 (android) ...① 修改设备树,添加pwm节点: 位置:kernel/msm-3.18/arch/arm64/boot/dts/qcom/msm8953-mtp.dtsi 在soc中添加节点,如下: gpio-demo { compatible = "gpio-demo"; ...
  • stm32通过IO口模拟输出多路pwm

    万次阅读 2018-04-14 10:37:59
    这里主要用于控制舵机,使用TIM1模拟了5路50Hz的PWM信号,只调节占空比控制舵机角度。... //IO口初始化,这里就不介绍了,推挽输出 LED p2('A',9); LED p3('A',10); LED p4('A',11); LED p5('A'...
  • IO模拟PWM实现频谱灯呼吸和闪烁效果!!!!!!!!!!!!!!!!!!
  • 本人把呼吸灯函数放在了定时器中断中,通过函数标志位是否被置1来控制呼吸灯功能是否打开,通过IO口模拟PWM方波来控制LED灯的亮度 case Type_Breathing_LED: PWM_Flag=1; break; 为了简单明了,直接在...
  • 用普通IO口PWM输出[复制链接]本人现在想用IO口PWM输出,频率1KHz,然后用两按键(+、-)来调节占空比0-100%,对应数码管显示000-100。现波形是OK了,也可以调占空比,但是出现一个问题数码管显示乱七八糟,调了两...
  • 分别是高电平定时器时间和低电平定时器时间,让这两个的和为1us(即产生pwm最小周期1us)控制这两个变量的比值即可控制占空比,其相应的乘上系数最终就是真正的高低电平时间(周期),具体的根据手稿确定。...
  • 51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。
  • 51单片机模拟输出PWM

    2018-09-05 23:27:37
    89c51单片机通过定时器定时,对IO口进行操作,模拟PWM信号。
  • 以定时器1为例  uchar time1_10ms = 0;  uchar time1_100ms = 0;  bit IS_10ms = 0;... uchar PWM_time = 0;//亮度级数  uchar pwm_time_flag = 0;//计时1s标志位  uchar duty_cycle = 0;//...
  • 利用定时器进行软件模拟PWM多路输出,有的产品设计中硬件PWM资源缺少,必须使用软件去模拟。 该方法可由一个定时器输出多路PWM。
  • 普通IOPWM口的区别

    千次阅读 2019-10-10 08:51:48
    1.可能的不同:io模拟PWM速度不是很快。
  • stm32普通IO口捕获PWM的高电平

    千次阅读 2016-12-10 19:55:31
    思路:普通IO口配置上升沿下降沿触发中断,然后配置一个定时器(周期大于等于PWM周期),在IO口中断中读取定时器计数。 定时器不需要配置中断 void TIM3_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_...
  • 编译器:MPLAB 8.73 内部文件含有: 1.2个例子文件。 2.工程文件。 3.Output文件。 4.PIC12F508中文规格书一份 注意: 1.用编译器重新加载工程文件 2.用编译器重新加载头文件路径
  • Linux下实现使用 GPIO管脚模拟脉宽调制PWM的功能
  • 基于stc90c51的占空比和频率可调的c语言程序。测试通过
  • STM32F103C8的IO口输入输出与PWM总结

    千次阅读 2020-11-02 16:48:17
    STM32F103C8的IO口输入输出与PWM总结前言一、有关IO输出输入的总结一、输入模式1.浮空输入(GPIO_Mode_IN_FLOATING)2.上拉输入(GPIO_Mode_IPU)3.下拉输入(GPIO_Mode_IPD)4.模拟输入(GPIO_Mode_AIN)二、输出...
  • 使用hrtimer高精度定时器之GPIO模拟PWM

    千次阅读 2019-02-13 10:26:44
    使用hrtimer高精度定时器之GPIO模拟PWM NanoPI NEO Air 的PA6根据数据手册来看并不支持硬件PWM功能,如需实现pwm只能软件模拟,有两种方案一种是应用层通过单独起一个线程,另一种使用内核的hrtimer高精度定时器...
  • 照ST公司宁可自己设计IIC都不肯给飞利浦专利费,那我估计也价格也并不便宜,但是STM32设计的IIC非常不稳定,时常出现丢失信号的问题,所以现在来使用IO口对IIC进行模拟 模拟状态如下: 1.IIC启动时 2.IIC停止时 3....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,500
精华内容 1,000
关键字:

io口模拟pwm