集成两路MAX1169的STC8G1K08模块,带有两路PWM输出

 

■ 设计背景


集成有MAX1169,MAX520的DAAC单片STC8G1K08机电路板 中设计了集成有MAX1169的ADDA模块,对于一些需要使用PWM驱动的实验,这款模块还无法进行集成实验。

设计集成有两路MAX1169以及PWM输出的测试模块可以为很多实验提供测量和驱动功能。

比如:

 

01电路模块设计


1.电路设计1

▲ SCH原理图设计

▲ SCH原理图设计

▲ PCB电路板和快速制版PCB的实验模块

▲ PCB电路板和快速制版PCB的实验模块

  • 实验接口:(从右往左定义1,2,3,4~8)
PIN12345678
+5VGNDAINAIN1AGNDPWM1IOGND

2.单片机软件设计2

  • OSC工作频率:35MHz, UART:460800bps

设置STC8G1K08的关于I2C以及PACKAGE_SOP8 的共定义。

#define PACKAGE_SOP8        1
#define USSD_EN             0
#define I2C_EN              1
#define SPI_EN              0

(1) 软件说明

CCP2: 是PWM Channel3

(2) 串行命令

else IFARG0("maxstcpwm") {
    sscanf(SDA(1), "%d", &nNumber);
    PWM3SetPWM(0x3ff - nNumber);
} else IFARG0("maxstcread") {
    printf("%u %u\r\n", MAX1169Read(), MAX1169Read1());
} else IFARG0("maxstcreadb") {
    nNumber = MAX1169Read();
    SendChar((unsigned char)(nNumber >> 8));
    SendChar(nNumber);
    nNumber = MAX1169Read1();
    SendChar((unsigned char)(nNumber >> 8));
    SendChar(nNumber);
} else IFARG0("maxstcon") {
    ON(IO_PIN);
} else IFARG0("maxstcoff") {
    OFF(IO_PIN);
}

 

02电路测试


1.PWM输出

  • 输出管脚: 3
  • PWM 频率:34.17kHz(示波器实测)

单片机工作频率: f o s c = 35 × 1 0 6 f_{osc} = 35 \times 10^6 fosc=35×106Hz,PWM的位数:10位。
理论上计算PWM频率为:

f P W M = f o s c 2 10 = 35 × 1 0 6 1024 = 34.18 k H z f_{PWM} = {{f_{osc} } \over {2^{10} }} = {{35 \times 10^6 } \over {1024}} = 34.18kHz fPWM=210fosc=102435×106=34.18kHz

设置命令: maxstcpwm n

◎ 调试说明:

在STC8G1K08等单片机中,对于CCAP0H的赋值必须紧接着XCAP0H的赋值,所以对于其中的PWM1SetPWM函数需要进行修改:

//------------------------------------------------------------------------------
#if PWM_CHANNEL1_EN
void PWM1SetPWM(unsigned int nPWM) {
#if PWM1_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM0
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;
    PCA_PWM0 = ucPCA;    
#endif // PWM1_BIT
    CCAP0H = (unsigned char)(nPWM & 0xff);
                                            // CCAP0H:Must be assign value after XCAP0H
                                            // is valued.
}
#endif //  PWM_CHANNEL1_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL2_EN
void PWM2SetPWM(unsigned int nPWM) {
#if PWM2_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM0
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;
    PCA_PWM1 = ucPCA;    
#endif // PWM2_BIT
    CCAP1H = (unsigned char)(nPWM & 0xff);
}
#endif //  PWM_CHANNEL2_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL3_EN
void PWM3SetPWM(unsigned int nPWM) {
#if PWM3_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM2;
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;    
    PCA_PWM2 = ucPCA;
#endif // PWM3_BIT
    CCAP2H = (unsigned char)(nPWM & 0xff);
}
#endif //  PWM_CHANNEL3_EN

2.IO输出

  • 输出管脚:2
    设置命令:maxstcon, maxstcoff

3. 两路AD

  • 对应管脚:PIN5,PIN6
    左边对应的: AD2
    右边对应的: AD1

 

03输入输出信号测试


1.对输出PWMRC滤波采集

▲ 对PWM输出RC滤波采集

▲ 对PWM输出RC滤波采集

2.对于IO口的RC波形采集

  • R= 10k, C = 100uF

▲ 对于IO口的RC波形进行采集

▲ 对于IO口的RC波形进行采集

使用scipy.optimize中的curve_fit函数对于上述采集数据进行指数拟合。
得到的参数为:[-6.71239337e+04 -9.76200318e-01 6.87801729e+04]
对应的表达式为:
y ( t ) = 6.878 × 1 0 4 − 6.712 × 1 0 4 × e − ( t × 0.976 ) y\left( t \right) = 6.878 \times 10^4 - 6.712 \times 10^4 \times e^{ - \left( {t \times 0.976} \right)} y(t)=6.878×1046.712×104×e(t×0.976)

其中的时间常数 τ = 0.976 s \tau = 0.976s τ=0.976s

这与 R ⋅ C = 1 s R \cdot C = 1s RC=1s很接近了。

▲ 进行数据拟合

▲ 进行数据拟合

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY                     -- by Dr. ZhuoQing 2020-07-23
#
# Note:
#============================================================
from headm import *
from scipy.optimize         import curve_fit
val = tspload('rcdata', 'val')
t = array(range(len(val))) * 0.01
def func(x, a, b, c):
    return a * exp(x*b) + c
param = [-10000, -0.1, 60000]
param, conv = curve_fit(func, t, val, p0=param)
printf(param)
fitval = func(t, *param)
#------------------------------------------------------------
plt.plot(t, val, label='measure')
plt.plot(t, fitval, label='fit')
plt.xlabel("Time(s)")
plt.ylabel("Output")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
#------------------------------------------------------------
#        END OF FILE : TEST2.PY
#============================================================

 

※ 结论


基于两颗MAX1169构成了两路的16bitAD转换模块。通过STM8G1K08-SOP8的CCP2输出PWM波形。PWM的频率为34kHz,分辨率为10bi。

在调试过程,修改了原来STC8G单片机中的PWMnSetPWM()中的函数。对于PWMn的赋值与PWM_CCP的赋值按照满足STC8G1K08数据手册中的一看球。


  1. 电路模块AD工程文件:AD\Test\2020\Tools\MAX1169STC8G1K08.PcbDoc * ↩︎

  2. 单片机软件工程文件:C51\STC\Test\2020\Tools\MAX1169STC8G1K08\MAX1169STC8G1K08.uvproj ↩︎

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值