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输出下




学习了。
页: 1 2 3 4 5 6 [7]
查看完整版本: 【冲哥版】stc32学习心得