这里主要用于控制舵机,使用TIM1模拟了5路50Hz的PWM信号,只调节占空比控制舵机角度。
最大能模拟多少路没有具体测试。
缺点:因为是定时器中断模拟(中断比较频繁),所以会影响main函数运行。
LED p1('A',8); //IO口初始化,这里就不介绍了,推挽输出
LED p2('A',9);
LED p3('A',10);
LED p4('A',11);
LED p5('A',4);
u16 count=0;
u16 pwm_count=1000; //总计数 周期20ms,20us进次
u16 pwm1=25;
u16 pwm2=25;
u16 pwm3=25;
u16 pwm4=125;
u16 pwm5=125;
extern "C" void TIM4_IRQHandler(void)//1ms进来1次
{
if(TIM4->SR&0X0001)//溢出中断
{
count++;
if(count {
PAout(8)=1;
}
else{
PAout(8)=0;
}
//-------------------------------
if(count {
PAout(9)=1;
}
else{
PAout(9)=0;
}
//------------------------------
if(count {
PAout(10)=1;
}
else{
PAout(10)=0;
}
//--------------------------------
if(count {
PAout(11)=1;
}
else{
PAout(11)=0;
}
//-------------------------------
if(count {
PAout(4)=1;
}
else{
PAout(4)=0;
}
if(count==pwm_count)count=0;
}
TIM4->SR&=~(1<<0);//清除中断标志位
}
//使能定时器4,使能中断.
void Timer1_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2; //TIM4时钟使能
TIM4->ARR=arr; //设定计数器自动重装值
TIM4->PSC=psc; //预分频器71,得到1Mhz的计数时钟
TIM4->DIER|=1<<0; //允许更新中断
TIM4->CR1|=0x01; //使能定时器2
MY_NVIC_Init(1,1,TIM4_IRQn,2);//抢占1,子优先级1,组2(组2中优先级最高的)
}
Timer1_Init(19,71); 初始化就好,20us一次中断。
通过更改这些值控制舵机角度
19,和总计数控制频率。
关键字:stm32 IO口模拟 pwm
引用地址:
stm32通过IO口模拟输出多路pwm
推荐阅读最新更新时间:2024-03-16 16:07
stm32 数据类型的定义
在Keil MDK 开发环境里,比如一个 无符号32位整形数据会有很多种表示方法:1,unsigned int 32 (C语言标准表达方法) 2,uint32_t ; 3 ,u32; 这三种方式都是在表达同一个意思,可为什么ST的开发人员要搞的这么乱呢? 还有其他好多你可能看起来很陌生 ,很不好理解的表达方式,如:_IO int32_t 他等同于vs32(这个你同样很陌生),不过他还等同于 volatile int32_t, 还等同于 volatile signed int 32;最后这种表达方式才是C语言的标准表达方式,够乱吧,能把初学者弄的晕头转向。 其实ST 搞这么多花样,无非是想开发人员在写代码时定义数据类型能少写几个符
[单片机]
STM32使用FSMC控制NAND flash 例程
近几天开发项目需要用到STM32驱动NAND FLASH,但由于开发板例程以及固件库是用于小页(512B),我要用到的FLASH为1G bit的大页(2K),多走了两天弯路。以下笔记将说明如何将默认固件库修改为大页模式以驱动大容量NAND,并作驱动。 本文硬件:控制器:STM32F103ZET6,存储器:HY27UF081G2A 首先说一下NOR与NAND存储器的区别,此类区别网上有很多,在此仅大致说明: 1、Nor读取速度比NAND稍快 2、Nand写入速度比Nor快很多 3、NAND擦除速度(4ms)远快于Nor(5s) 4、Nor 带有SRAM接口,有足够的地址引脚来寻址,可以很轻松的挂接到CPU地址和数据总线上,对CPU要
[单片机]
stm32 外部中断知识介绍
中断分类 STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。线16:连接到 PVD 输出。线17:连接到 RTC 闹钟事件。线18:连接到 USB 唤醒事件。 触发方式 :STM32 的外部中断是通过边沿来触发的,不支持电平触发。 外部中断分组: STM32 的每一个GPIO都能配
[单片机]
STM32 DMA 多通道 ADC 采集
1. 本次实践目标 a. 完成外部 ADC 的采集, 连接引脚为 PC2 b. 完成 STM32 内置温度传感器 ADC 的采集 c. ADC 的采集必须以 DMA 的方式工作,通过 FreeRTOS 系统中创建的一个进程读取采集结果,并打包通过网络发送至上位机 2. 查看 datasheet 2.1 确认 STM32 内部温度传感器 使用哪个 ADCx , 使用哪个 channel 经确认,STM32 内部温度传感器使用 ADC1 的 channel_16。 2.2 查看 PC2 引脚作为 ADC 输入时,使用哪个 ADCx, 使用哪个 channel 经确认,S
[单片机]
STM中SPI运用的NSS引脚解读
STM的NSS引脚 首先我们说该引脚有两个电平需要注意,一个是与NSS引脚连接的外部电平,一个是NSS引脚的内部电平。 然后我们知道在SPI通信的时候master必须在NSS引脚的内部电平为高电平时才得以进行通信,slaver在NSS引脚的内部电平为低电平时才可以通信。这是前提条件。 我们知道NSS引脚电平的管理有两种方式,一个是软件管理和硬件管理。但当为硬件管理时(SSM=0),NSS管脚的内部电平由与NSS连接的外部电平决定,即外面是高电平,则NSS引脚的内部电平也为高电平。如果你想工作在该模式下,那么master的NSS引脚必须连接高电平,slaver必须连接低电平(一般接地)。软件管理模式(SSM=1)则是通过SS
[单片机]
STM32 正交编码器代码
/******************** (C) COPYRIGHT 2007 STMicroelectronics ******************** * File Name : stm32f10x_encoder.c * Author : IMS Systems Lab * Date First Issued : 21/11/07 * Description : This file contains the software implementation for the * encoder unit ***********************************
[单片机]
stm32实用循环buffer
本人在实际开发中多次用到串口的循环buffer,最开始在网上搜索了相关文章和资料,感觉通用性不是很高。自己也写过fifo,感觉还是过于臃肿。一直想找个完美的循环buffer。在看linux内核代码时,发现内核里面也经常使用fifo。linux内核代码是最优美、精简的,高效的代码。真是“山穷水尽疑无路,柳暗花明又一村”。特意移植除出来,希望对大家有用。代码设计的相当的巧妙~~~ 头文件: /******************************************************************************* * @File : fifo.h * @Author : cqx * @
[单片机]
昂宝推出面向开关电源的高集成度的PWM控制芯片
昂宝电子推出的高集成度、高功能的脉宽调制(PWM)控制芯片——OB2268/OB2269,此芯片应用于交流/直流开关电源。OB2268/OB2269内含昂宝的多项专利技术,使得系统设计更容易符合2007年国际能源机构(IEA)、能源之星(Energy Star)和蓝色天使(Blue Angel)建议的各项具体要求,及降低产品设计成本的考虑。 OB2268/OB2269系列产品采用BiCMOS工艺,超低的启动电流(5μA)、工作电流( 3mA)和各项优化设计,让系统(含EMI策略)的性能在同类产品中的表现更胜一畴。芯片采用无铅工艺,符合RoHS等各项绝色环保要求,并可提供通过认证的昂宝电子SGS报告。 特点包括:
[新品]