zhange
发表于 2024-5-26 17:22:11
本帖最后由 zhange 于 2024-5-26 17:59 编辑
第三十二集:串口EEPROM芯片数据读写
1.24c02 不需要擦除扇区既可以写入。
2.函数移植前,要先了解函数的功能。
3.编译出现错误,一般改掉第一个错误就好了。。
4.强制转换数据类型(char)(int)
5.这节课对我的项目作用不大,大致看了下,没细看。。。。
6.cdc串口可以实现任意波特率,以前没研究,这个以后得研究呀。。。
====等二刷吧====
zhange
发表于 2024-5-26 18:03:47
本帖最后由 zhange 于 2024-5-26 21:13 编辑
第三十三集:PWM基础
1.波形
2.stc32带16位PwM控制器, 但是他远没表面看起来这么简单!! PwM+PFM+各种方波的输入检测和输出都可以实现!!
3.幅值
4.幅值:高低电平电压差
正脉宽:高电平时间
负脉宽:低电平时间
周期:高电平+低电平时间
频率:周期的倒数
占空比:一般指高电平时间占周期时间的百分比
死区:两路方波之间高电平之间的时间差
相位差:方波移相
5. pwm应用:灯光调节电机速度等
zhange
发表于 2024-5-26 21:28:06
本帖最后由 zhange 于 2024-5-27 11:00 编辑
第三十四集:单通道PWM输出上
1.1刷没记住啥?????
====二刷吧====
1.PWMA 适用于许多不同的用途:
基本的定时
测量输入信号的脉冲宽度(输入捕获)
产生输出波形(输出比较,PWM 和单脉冲模式)
对应与不同事件(捕获,比较,溢出,刹车,触发)的中断
与 PWMB 或者外部信号(外部时钟,复位信号,触发和使能信号)同步
PWMA 广泛的适用于各种控制应用中,包括那些需要中间对齐模式 PWM 的应用,该模 式支持互补
输出和死区时间控制。
PWMA 的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。
2.void PWMA_Init(void) //PWMA的初始化
{
//1.时钟源选择这里不改,默认22.1184mhz
//2.时基单元选择
PWMA_PSCRH = 0; //1分频
PWMA_PSCRL = 0;
PWMA_ARRH= (u8)(PWM_ARR>>8);//自动重装寄存器高位
PWMA_ARRL= (u8)(PWM_ARR);
PWMA_CCR1H= (u8)(PWM_CCR>>8);//捕获比较寄存器
PWMA_CCR1L= (u8)(PWM_CCR);
//3.输入输出的引脚配置
PWMA_ENO = 0X00; //使能PWM1n通道输出
PWMA_ENO |= 0X02;
PWMA_PS =0x00; //选择PWM1从P60引脚输出
PWMA_PS |= (2<<0);
//4.输入输出模式设置
PWMA_CCER1 = 0X00;
PWMA_CCMR1 = 0X68; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x04; //开启输出比较通道
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1 |= 0X01; //启动计数器
}
zhange
发表于 2024-5-27 14:48:44
本帖最后由 zhange 于 2024-5-27 14:59 编辑
第三十四集:续
1.使用自动重载,时序如下图,当当前值没有溢出之前仍是前一个溢出值,溢出完以后才是新设置的溢出值。
一般推荐使用自动重载。防止pwm失控
2.计数模式:上下计数(边缘对齐),中央对齐模式
3.ccr比较值arr溢出值
4.先使能通道,再选择引脚。
5.想要接到外部pwm信号,必须接到p通道上。
zhange
发表于 2024-5-27 16:44:12
第三十四集:单通道PWM输出下
1.开始写代码之前先背一下步骤
[*]1.确定时钟
[*]
[*]2.选择时基
[*]
[*]3.引脚配置
[*]
[*]4.输出模式配置
2.要写就要和老师的有点区别。
宏定义:
#define PWM_ARR 1999
#define PWM_CCR 200
时钟:默认的系统时钟
时基:
PWMA_PSCRH = 0;//2分频
PWMA_PSCRL = 0x02;
PWMA_ARRH =(u8)(PWM_ARR>>8);
PWMA_ARRL = (u8)(PWM_ARR);
PWMA_CCR1H =(U8)(PWMCCR>>8);
PWMA_CCR1L = (U8)PWM_CCR;
引脚配置
PWMA_ENO = 0X00;
PWMA_ENO |=0X01; //选择p60
PWMA_PS =0x00;
PWMA_PS |= 0X02;
//4.输入输出模式设置
PWMA_CCER1 = 0X00;
PWMA_CCMR1 = 0X68; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x03; //开启输出比较通道
PWMA_BKR = 0X80; //使能主输出
使能计数器
PWMA_CR1 |= 0X01;
zhange
发表于 2024-5-28 07:53:43
本帖最后由 zhange 于 2024-5-28 08:56 编辑
第三十五集:任意频率和占空比的PWM输出上
1.频率计算公式:SYSclk/((PSCR+1)*(ARR+1))
SYSclk:系统时钟arr:溢出值 pscr:分频 arr和pscr最大值65535 (2的16次方)
要计算20khz的频率就可已根据上面的公式计算出在系统频率为22.1184兆hz时,分频为0,arr为1105
2.互补同向pwm输出。
[*]
[*]如何使能互补/同相输出?
[*]1.使能ENO寄存器,打开互补输出的通道
[*]2.CCERx寄存器打开比较输出使能
[*]
[*]如何设置输出的另一半波形是互补还是同相?
[*]1.CCERx寄存器设置比较输出极性(如果要输出同向,可以吧p和n的极性设为相反,就是ccr(比较值)和cnt(当前计数器值)比较输出的高低电平)
3.死区计算
如果死区寄存器设置为00001111 计算公式为 00001111 * 系统时钟1个周期时间 比如系统频率为24Mhz 死区时间为0.625微秒
如果死区寄存器设置为11111111 计算公式为 (32 + DTGn) * 16 * tCK_PSC 32+31=63*16=1008 1008/24 = 42微秒 系统频率为24Mhz
zhange
发表于 2024-5-28 09:00:01
死区计算学会了 谢谢冲哥{:4_167:}{:4_167:}{:4_167:}看了两遍
zhange
发表于 2024-5-28 09:25:52
第三十五集:任意频率和占空比的PWM输出下
====熊的,毕业了。。。。。====
1.电机正反转原理(这里接的直流电机)
切换正负极可以实现正反转。
2.控制代码
void PWMA1_Set(int pwm)
{
if( pwm==0 ) //电机停止
{
//1p 1n均为低电平
PWMA_CCR1H = 0;
PWMA_CCR1L = 0;
PWMA_ENO &= 0XFC; //关闭1p 1n通道
PWM1P = 0;
PWM1N = 0;
}
else if( pwm>0 ) //电机正转
{
if( pwm >(PWM_ARR+1) )
pwm = (PWM_ARR+1);
PWMA_CCR1H = (u8)(pwm>>8);
PWMA_CCR1L = (u8)(pwm);
PWMA_ENO &= 0XFC; //关闭1p 1n通道
PWMA_ENO |= 0X01; //使能PWM1p通道输出
PWM1N = 0;
}
else if( pwm<0 ) //电机反转
{
pwm = -pwm;
if( pwm >(PWM_ARR+1) )
pwm = (PWM_ARR+1);
PWMA_CCR1H = (u8)(pwm>>8);
PWMA_CCR1L = (u8)(pwm);
PWMA_ENO &= 0XFC; //关闭1p 1n通道
PWMA_ENO |= 0X02; //使能PWM1n通道输出
PWM1P = 0;
}
}
====熊的,毕业了。。。。。====
zhange
发表于 2024-5-28 09:27:13
{:4_195:}{:4_195:}{:4_195:}{:4_195:}{:4_195:}{:4_195:}{:4_195:}
完结了 完结了
必须写代码测试去了{:4_174:}{:4_174:}{:4_174:}{:4_174:}
lclbf
发表于 2024-11-5 08:27:25
zhange 发表于 2024-5-28 09:25
第三十五集:任意频率和占空比的PWM输出下
学习了。