产品
有人云 — 物联网云平台 零编程,组态拖拽即可实现远程监控。同时支持私有部署,拥有属于自己的软硬件一体化方案
200
+
私有云项目
数据本地化
业务个性化
10
+
万 公有云注册用户
80%公有云功能免费
付费VIP享自定义品牌服务
有人云官网
有人智造 — ODM/EMS 依托自动化、智能化、柔性化、透明化的智能工厂,
提供代研、代料、代工一站式OEM/ODM服务
有人智造官网
有人智能 — 解决方案 打包提供云、管、边、端整体解决方案
从问题诊断、方案设计,到实施落地、系统运维
有人智能官网
新闻资讯
avr单片机 PWM 超级函数 可以设置周期为2us~65ms
2010-11-28


共享超级PWM设置函数 可以设置周期为2us~65ms 可设占空比 2路PWM,使用定时器1,16位定时器,已经在电机控制产品中使用

实测2us~65ms 非常准确
void pwmIint_us(uint16 zhouqi_us,uint16 high_us_A,uint16 high_us_B)
三个参数为 周期,第一路高电平时间,第二路高电平时间。

古欣 版权所有,转载请注明出处

请自行定义部分内容

要直接编译 还需要加一些定义,如包含头文件,增加类型定义。
typedef unsigned char uint8;

typedef unsigned int uint16;

[code="c"]

#define F_CPU_M   7.3728
#define DDR_OC1   DDRB
#define PORT_OC1A PB1
#define PORT_OC1B PB2
#define CKDIV_0     0
#define CKDIV_1     1
#define CKDIV_8     2
#define CKDIV_64   3
#define CKDIV_256   4
#define CKDIV_1024   5

//Time=PRE*(MAX-TCNT0+1) /F_cpu 这里time以秒为单位 F_cpu以hz为单位
//Time*F_cpu=PRE*MAX
//Max=Time*F_cpu/pre;

//2us ~ 65000us (65ms)
void pwmIint_us(uint16 zhouqi_us,uint16 high_us_A,uint16 high_us_B)
{
uint8 ckdiv = 1; //预分频
float tmp;

if((float)zhouqi_us>(float)(65536/F_CPU_M))
{
TCCR1B=CKDIV_8;//控制预分频
ckdiv = 8;
}
else
{
TCCR1B=CKDIV_1;//控制预分频
}

tmp=F_CPU_M*(float)(zhouqi_us/ckdiv);
ICR1 = (uint16)tmp; //控制最高计数
if(high_us_A)
{
DDR_OC1|=(1<<PORT_OC1A); //对应引脚为输出
TCCR1A |=(1<<COM1A1);   //比较匹配时清零
tmp=F_CPU_M*(float)(high_us_A/ckdiv);
OCR1A=(uint16)tmp;
}
if(high_us_B)
{
DDR_OC1|=(1<<PORT_OC1B);
TCCR1A |=(1<<COM1B1);
tmp=F_CPU_M*(float)(high_us_B/ckdiv);
OCR1B=(uint16)tmp;
}

TCCR1A |=(1<<WGM11); //WGM 11 12 13 组合表示 快速PWM模式 计数TOP 为ICR1
TCCR1B |=((1<<WGM13)|(1<<WGM12));
}

[/code]

pwmIint_us(200,100,0);的效果如图

pwmIint_us(65000,32500,0); 的效果



关注有人微信公众号
了解更多信息